枚举类
枚举类的使用
类的对象只有有限个,确定的。例如星期,性别,季节……;
当需要定义一组常量时,强烈建议使用;
如果枚举类中只有一个对象,则可以作为单例模式的实现方式
jdk5.0之前自定义枚举类
public class CompareTest {
@Test
public void test() {
Season spring = Season.Spring;
System.out.println(spring.getSeasonDesc());
}
}
//自定义枚举类
class Season {
//声明Season对象的属性
private final String seasonName;
private final String seasonDesc;
//私有化构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//提供枚举类的多个对象
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("冬天", "冰封千里");
//获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//提供toString方法
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
jdk5.0后可以使用enum关键字定义枚举类
使用enum定义的枚举类,默认继承于java.lang.Enum类
public class EnumTest {
@Test
public void test() {
Season summer = Season.Summer;
System.out.println(summer);
System.out.println(Season.class.getSuperclass());
}
}
//使用enum关键字定义枚举类
enum Season {
//提供枚举类的多个对象,之间用逗号隔开,最后的用;
Spring("春天", "春暖花开"),
Summer("夏天", "骄阳似火"),
Autumn("秋天", "秋色宜人"),
Winter("冬天", "冰封千里");
//声明Season对象的属性
private final String seasonName;
private final String seasonDesc;
//私有化构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
Enum类的主要方法
@Test
public void test() {
Season summer = Season.Summer;
System.out.println(summer);
System.out.println(Season.class.getSuperclass());
//直接填对象也是默认调toString方法
System.out.println(summer.toString());
//获取枚举类提供的对象
Season[] values = Season.values();
System.out.println(Arrays.toString(values));
Thread.State[] states = Thread.State.values();
System.out.println(Arrays.toString(states));
//获取指定的枚举类对象
Season spring = Season.valueOf("Spring");
System.out.println(spring.getSeasonDesc());
}
使用enum关键字定义的枚举类实现接口的情况
情况一:实现接口,在枚举类中实现抽象方法
情况二:让枚举类的对象分别实现接口中的抽象方法
public class EnumTest {
@Test
public void test() {
Season summer = Season.Summer;
Season winter = Season.Winter;
winter.show();
summer.show();
}
}
//使用enum关键字定义枚举类
enum Season implements info {
//提供枚举类的多个对象,之间用逗号隔开,最后的用;
Spring("春天", "春暖花开"),
Summer("夏天", "骄阳似火") {
@Override
public void show() {
super.show();
System.out.println("这是重写的show方法");
}
},
Autumn("秋天", "秋色宜人"),
Winter("冬天", "冰封千里");
//声明Season对象的属性
private final String seasonName;
private final String seasonDesc;
//私有化构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public void show() {
System.out.println(this.getSeasonDesc());
}
}
interface info {
void show();
}
注解 (Annotation)
代码中的特殊标记,如:@Override,@Test等,可以在编译,类加载,运行时被读取并执行相应的处理。
可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的”name=value“对中。
注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 + 设计模式。
Annotation的使用示例
自定义注解
注解声明为:@interface
内部定义成员,通常使用value表示
可以指定成员的默认值,使用default定义
如果自定义注解没有成员,表明是一个标识作用。
使用
JDK中的元注解
用来修饰其他Annotation定义,对该Annotation进行解释说明
JDK5.0提供了4个标准的meta-annotation类型,分别是:
@Retention:用于指定该Annotation的生命周期;
@Rentention必须包含一个RetentionPolicy类型的成员变量:
RetentionPolicty.SOURCE:在源文件中有效
RetentionPolicty.CLASS:在class文件中有效 不指定@Rentention时默认为这个
RetentionPolicty.RUNTIME:在运行时有效 可以通过反射获取该注解
@Target:用于指定被修饰的Annotation能用于修饰哪些程序元素
@Target也包含一个名为value的成员变量
可包含
ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR 等
@Documented:用于指定被该Annotation修饰的Annotation类将被javadoc工具提取成文档(定义为Documented的注解必须设置Retention值为RUNTIME)
@Inherited:被它修饰的Annotation将具有继承性,如果某个类使用了被@Inherited修饰的Annatation,则其子类将自动具有该注解 (这两个用的较少)
例:
获取类的注解
JDK8中的新特性:可重复注解,类型注解
可重复注解
类型注解
JDK8之后,关于元注解@Target的参数类型ElementType枚举值多了两个:TYPE_PARAMETER,TYPE_USE
这样注解就可以应用在任何地方
ElementType.TYPE_PARAMETER表示该注解能写在类型变量的声明语句中,如(泛型声明)
ElementType.TYPE_USE表示该注解能写在使用类型的任何语句中