当需要定义一组常量时,强烈建议使用枚举类
JDK1.5之前需要自定义枚举类。JDK 1.5 新增的 enum 关键字用于定义枚举类
枚举类的属性
JDK1.5之前:自定义枚举类
私有化类的构造器,保证不能在类的外部创建其对象
在类的内部创建枚举类的实例。声明为:public static final
对象如果有实例变量,应该声明为private final,并在构造器中初始化
class Season{ // 1. 实例变量,应该声明为private final,并在构造器中初始化 private final String name; private final String desc; // 2. 私有化类的构造器,保证不能在类的外部创建其对象 private Season(String name,String desc){ this.name = name; this.desc = desc; } // 3. 在类的内部创建枚举类的实例。声明为:public static final public static final Season SPRING = new Season("春天", "春暖花开"); public static final Season SUMMER = new Season("夏天", "夏日炎炎"); public static final Season AUTUMN = new Season("秋天", "秋高气爽"); public static final Season WINTER = new Season("冬天", "白雪皑皑"); // 提供get方法 public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { return "Season{" + "name='" + name + '\'' + ", desc='" + desc + '\'' + '}'; } }
public class EnumDemo { public static void main(String[] args) { System.out.println(Season.AUTUMN); } } enum Season{ // 在枚举类的第一行声明枚举类对象 Season("春天", "春暖花开"), SUMMER("夏天", "夏日炎炎"), AUTUMN("秋天", "秋高气爽"), WINTER("冬天", "白雪皑皑"); // 1. 实例变量,应该声明为private final,并在构造器中初始化 private final String name; private final String desc; // 2. 私有化类的构造器,保证不能在类的外部创建其对象 private Season(String name,String desc){ this.name = name; this.desc = desc; } // 提供get方法 public String getName() { return name; } public String getDesc() { return desc; } }
框架 = 注解 + 反射 + 设计模式。
注意:自定义注解必须配上注解的信息处理流程才有意义。
JDK5.0提供了4个标准的meta-annotation类型,分别是:Retention、Target、Documented、Inherited
@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 的生命周期, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用@Rentention 时必须为该 value 成员变量指定值:
@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素。@Target 也包含一个名为 value 的成员变量。
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被javadoc 工具提取成文档。默认情况下,javadoc是不包括注解的。 定义为Documented的注解必须设置Retention值为RUNTIME。
@Inherited: 被它修饰的 Annotation 将具有继承性。如果某个类使用了@Inherited 修饰的 Annotation, 则其子类将自动具有该注解。比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以继承父类类级别的注解
我们一般使用自定义注解会加下面这两个
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) public @interface MyAnnotation { // 没有默认值时,在使用时需要添加值 // 单个成员变量 String value() default "tbc"; // String[] value() default "tbc"; // 多个成员变量 }