Java 高级特性 枚举、注解

113

一. 自定义枚举类

  1. 不使用关键字定义枚举类
//    声明枚举类
class Season{
//    提供类的属性 private final
    private final String name;
    private final String desc;

//    声明final的属性, 在构造器中初始化
    public Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

//    通过公共的方法获取属性
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

//    创建枚举类对象
    public static final Season SPRING = new Season("spring", "春暖花开");
    public static final Season SUMMER = new Season("summer", "炎炎夏日");
    public static final Season AUTUMN = new Season("autumn", "秋高气爽");
    public static final Season EAST = new Season("east", "岁暮天寒");

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

public static void main(String[] args) {
	Season spring = Season.SPRING;
	System.out.println(spring);
}
  1. 使用enum关键字定义枚举类
enum Season {
    SPRING("spring", "春暖花开"),
    SUMMER("summer", "炎炎夏日"),
    AUTUMN("autumn", "秋高气爽"),
    EAST("east", "岁暮天寒");

    private final String name;
    private final String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

常用的方法: values(), valueOf(String name) 要传入的形参是枚举类对象的名字, 否则报java.lang.IllegalArgumentException异常

public static void main(String[] args) {
	Season[] values = Season.values();
	for (Season season : values) {
		System.out.println(season);
	}
    /** print
	Season{name='spring', desc='春暖花开'}
	Season{name='summer', desc='炎炎夏日'}
	Season{name='autumn', desc='秋高气爽'}
	Season{name='east', desc='岁暮天寒'}
    */
    	
    
	String str = "SPRING";
	Season season = Season.valueOf(str);
	System.out.println(season);
    /** print
	Season{name='spring', desc='春暖花开'}
    */
}

如何让枚举类实现接口: 可以让不同的枚举类的对象调用被重写的抽象方法, 执行的效果不同(相当于让每个对象重写抽象方法)

interface Info{
	void show();
}

enum Season implements Info{
    SPRING("spring", "春暖花开"){
		public void show(){
			System.out.println("春风拂槛露华浓");
        }
    },
    SUMMER("summer", "炎炎夏日"){
		public void show(){
			System.out.println("连雨不知春去,一晴方觉夏深。");
        }
    },
    AUTUMN("autumn", "秋高气爽"){
		public void show(){
			System.out.println("万里悲秋常作客, 百年多病独登台");
        }
    },
    EAST("east", "岁暮天寒"){
		public void show(){
			System.out.println("老骥伏枥, 志在千里。烈士暮年,壮心不已");
        }
    };

    private final String name;
    private final String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

二. 注解Annotation

  1. JDK提供的常用注解
	@Override: 限定重写父类方法, 该注解只能用于方法
	@Deprecated: 用于表示某个程序元素(类, 方法等) 已过时
	@SuppressWarnings: 抑制编译器警告 
  1. 如何自定义一个注解
public @interface MyAnnotation {
	String values() default "DanielsShelby";
}
  1. 元注解

JDK的元Annotation用于修饰其他Annotation定义 JDK5.0提供了专门的注解上的注解类型, 分别是:

Retention: 只能用于修饰一个Annotation定义, 用于指定该Annotation可以保留多长时间, @Retention包含一个RetentionPolicy类型的成员变量(使用Rentention时必须为该value成员变量指定值)

Target: 用于修饰Annotation定义, 用于指定被修饰的Annotation能用于修饰哪些程序元素. @Target也包含一个名为value的成员变量

Documented: 用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档 (定义Documented的直接必须设置Retention值为RUNTIME)

Inherited: 被修似乎的Annotation将具有继承性. 如果某个类使用了被@Inherited修饰的Annotation, 则其子类将自动具有该注解 (实际应用中, 使用较少)