枚举类与注解
枚举类
定义
- 类的对象只有有限个,确定的
当需要定义一组常量时,使用枚举类
如果枚举类中只有一个对象,则可以作为单例模式的实现方式
如何自定义枚举类
- 1.声明Season对象的属性:private final修饰
- 2.私化类的构造器,并给对象属性赋值
- 3.提供当前枚举类的多个对象:public static final的
- 4.其他诉求1:获取枚举类对象的属性
- 4.其他诉求1:提供toString()
如何使用关键字enum定义枚举类
-
使用enum关键字枚举类 enum Season{}
-
默认的枚举类继承于java.lang.Enum类
-
1.提供当前枚举类的对象,多个对象之间用",“隔开,末尾对象”;“结束。–声明在一开始,并且不要加public static final等关键字。。直接写SPRING(”“,”")
-
2.声明Season对象的属性:private final修饰
-
3.私化类的构造器,并给对象属性赋值
-
4.其他诉求1:获取枚举类对象的属性
- 如果不重写toString()方法,则使用Enum类中的toString()方法,只是打印该常量名称-SPRING
在这里插入代码片
public class SeasonTest {
public static void main(String[] args) {
String s = Season.SPRING.getSeasonDesc();
System.out.println(s);
String s1 = Season.SUMMER.toString();
System.out.println(s1);
//toString
Season1 summer = Season1.SUMMER;
System.out.println(summer);
Season1[] values = Season1.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
for (Thread.State value : Thread.State.values()) {
System.out.println(value);
}
Season1 summer1 = Season1.valueOf("SUMMER");
System.out.println(summer1);
summer1.show();
}
}
class 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("冬天","冰天雪地");
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//4.其他诉求1:提供toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
interface info{
void show();
}
enum Season1 implements info{
//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
SPRING("春天","春暖花开"){
@Override
public void show() {
System.out.println("这是春天");
}
},
SUMMER("夏天","夏日炎炎") {
@Override
public void show() {
System.out.println("这是夏天");
}
},
AUTUMN("秋天","秋高气爽") {
@Override
public void show() {
System.out.println("这是秋天");
}
},
WINTER("冬天","冰天雪地") {
@Override
public void show() {
System.out.println("这是冬天");
}
};
//2.声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;
//2.私化类的构造器,并给对象属性赋值
private Season1(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
Enum类的主要方法
-
values()
-
返回所的枚举类对象构成的数组
- Season1[] values = Season1.values();
-
-
valueOf(String str)
-
返回枚举类中对象名是str的对象。
- 如果没str的枚举类对象,则抛异常:IllegalArgumentException
-
-
toString()
- 返回枚举类对象的名称
实现接口的枚举类
-
实现接口,在enum类中实现抽象方法
- 类似之前的实现类实现接口
-
让枚举类的对象分别实现接口中的抽象方法
注解-Annotation-增加对元数据的支持
定义
- Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation, 程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。
- Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明
- 使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。
使用
-
生成文档相关的注解
-
在编译时进行格式检查(JDK内置的个基本注解)
- @Override: 限定重写父类方法, 该注解只能用于方法
-
@Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的择
-
@SuppressWarnings: 抑制编译器警告
-
跟踪代码依赖性,实现替代配置文件功能
如何自定义注解
-
① 注解声明为:@interface
-
② 内部定义成员,通常使用value表示,以无参数方法的形式来声明
- 类型:八种基本数据类型、String类型、Class类型、enum类型、Annotation类型
-
③ 可以指定成员的默认值,使用default定义
-
④ 如果自定义注解没成员,表明是一个标识作用。eg:Override
-
说明
- 如果注解有成员,在使用注解时,需要指明成员的值。
- 自定义注解必须配上注解的信息处理流程(使用反射)才意义。
- 自定义注解通过都会指明两个元注解:Retention、Target
元注解
-
概念
- 对现有的注解进行解释说明的注解。
-
类型
-
Retention
-
Retention:指定所修饰的 Annotation 的生命周期:SOURCE\CLASS(默认行为)\RUNTIME只声明为RUNTIME生命周期的注解,才能通过反射获取。
-
生命周期
-
source
- 注解在编译器时就会被舍弃
在.class文件中不会保留注解信息
- 注解在编译器时就会被舍弃
-
class
- 编译器中会保留注解,但在运行时不会保留内存信息,也就是不会加载在内存中
-
runtime
- 编译器中会保留注解,也会在运行时会保留内存信息,也就是加载在内存中
-
-
-
Target
-
用于指定被修饰的 Annotation 能用于修饰哪些程序元素
-
类型
-
-
Documented
- 表示所修饰的注解在被javadoc解析时,保留下来。
- 定义为Documented的注解必须设置Retention值为RUNTIME。
-
Inherited
- 被它修饰的 Annotation 将具继承性
-
如何获取注解信息?
- 通过发射来进行获取、调用。
-
-
JDK8的新特性
-
可重复注解@Repeatable
-
Myannotation类
-
Myannotations类
① 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
② MyAnnotation的Target和Retention等元注解与MyAnnotations相同。
-
-
类型注解
- ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明。
- ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
-
总结: