枚举和注解。

  • 推荐使用枚举定义常量

        1、枚举常量更简单

        2、枚举常量属于稳态型

        3、枚举具有内置方法

        4、枚举可以自定义方法

        枚举类型是不能有继承的,也就是说一个枚举常量定义完毕后,除非修改重构,否则无法做扩展,而接口常量和类常量则可以通过继承进行扩展。

        注意:在项目开发中,推荐使用枚举常量代替接口常量或类常量。

  • 使用构造函数协助描述枚举项

        一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0、1、2......这一点我们非常熟悉。但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,他的含义是通过枚举的构造函数,声明每个枚举项(也就是枚举的实例)必须具有属性和行为,这是对枚举项的描述或补充,目的是使枚举项表述的意义更加清晰准确。

        推荐大家在枚举定义中为每个枚举项定义描述,特别是在大规模的项目开发中,大量的常量项定义使用枚举项描述比在接口常量或类常量中增加注释的方式友好的多,简洁的多。

  • 小心switch带来的空值异常

        使用枚举定义常量时,会伴有大量的switch语句判断,目的是为每个枚举项解释其行为。

        目前Java中的switch语句只能判断byte、short、char、int类型(JDK 7 已经允许使用String类型),这是Java编译器的限制。问题是为什么枚举类型也可以跟在switch后面呢?很简单,因为编译时,编译器判断出switch语句后的参数是枚举类型,然后就会根据枚举的排序值继续匹配。

        解决空值异常,判断输入参数是否是null即可。

扫描二维码关注公众号,回复: 1480662 查看本文章
  • 在switch的default代码块中增加AssertionError错误
  • 使用valueOf前必须进行校验

        valueOf方法会把一个String类型的名称转变为枚举项,也就是在枚举项中查找出字面值与该参数相等的枚举项。

        valueOf方法先通过反射从枚举类的常量声明中查找,若找到就直接返回,若找不到则抛出无效参数异常。

        解决问题方法:

        1、使用try...catch捕捉异常

        2、扩展枚举类

  • 用枚举实现工厂方法模式更简洁

        工厂方法模式(Factory Method Pattern)是“创建对象的接口,让子类决定实例化那一个类,并使一个类的实例化延迟到其子类”。

        枚举实现工厂方法模式有两种方法:

        1、枚举非静态方法实现工厂方法模式

        2、通过抽象方法生成产品

            枚举类型虽然不能继承,但是可以用abstract修饰其方法,此时就表示该枚举是一个抽象枚举,需要每个枚举项自行实现该方法,也就是说枚举项的类型是该枚举的一个子类。

        使用枚举类型的工厂方法模式有以下三个优点:

        1、避免错误调用的发生

        2、性能好,使用便捷

        3、降低类间耦合

        迪米特原则(Law of Demeter,简称为LoD):也就是最少知识原则:一个对象应该对其他对象有最少的了解。

  • 枚举项的数量限制在64个以内

        为了更好的使用枚举,Java提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用方法比较简单,EnumSet表示某一枚举的枚举项,EnumMap表示Key值必须是某一枚举的枚举项,由于枚举类型的实例数量固定并且有限,相对来说EnumSet和EnumMap的效率会比其他Set和Map要高。

        当枚举项数量小于等于64时,创建一个RegularEnumSet实例对象,大于64时则创建一个JumboEnumSet实例对象。

        JumboEnumSet类的原理与RegularEnumSet相似,只是JumboEnumSet使用了long数组容纳更多的枚举项。

  • 小心注解继承
  • 枚举和注解结合使用威力更大
        注解的写法和接口很类似,都采用了关键字interface,而且都不能有实现代码,常量定义默认都是public static final 类型的等,他们的主要不同点是:注解要在interface前加上@字符,而且不能继承,不能实现。
  • 注意@Override不同版本的区别

        @Override注解用于方法的覆写上,他在编译器有效,也就是Java编译器在编译时会根据该注解检查方法是否真的是覆写,如果不是就报错,拒绝编译。

        在多环境部署应用时,需要考虑@Override在不同版本下代表的意义,如果是Java 1.6版本的程序移植到1.5版本环境中,就需要删除实现接口方法的@Override注解。

猜你喜欢

转载自blog.csdn.net/en_joker/article/details/80510862