枚举类
枚举类:当类的对象是有限个,并且确定的常量,我们就称此类为枚举类,并且类似class也有属性,jdk1.5新增用enum关键字表示。由于枚举的实例为常量,习惯用大写字母对每个常量命名,并用",“隔开,最后一个以”;"结尾。比如我们开发中表示一周的7天,或者四季,性别等,都是能确定的常量,这就可以用枚举类。
枚举演示
定义一个季节的枚举,具体有春夏秋冬四个季节,代码如下:
/**
* 季节枚举类
*
*/
public enum Seaon{
SPRING("春天","春暖花开"),
SUMMER("夏天","汗流浃背"),
Autumn("秋天","硕果累累"),
WINTER("冬天","雪花漫天");
private String name;
private String desc;
Seaon(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 "Seaon{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
这样我们就很容易定义了一个枚举类,而不像jdk5之前去自定义枚举类,通过关键字enum
即可。
枚举测试
public class EnumTest {
public static void main(String[] args) {
//获取其中的Autumn
Seaon seaon=Seaon.Autumn;
//获取Autumn在枚举类中定义的顺序
int order=seaon.ordinal();
System.out.println("order:"+order);
//遍历所有枚举值
for (Seaon season:Seaon.values()) {
System.out.println(season.toString());
}
}
}
打印输出:
由此看出,枚举用法其实和普通类差不多,只不过用来定义一组常量对象而已。
枚举实现接口
枚举也可以像普通class一样实现接口,比如:
/**
* 动物枚举
*/
interface Action{
void show();
}
//实现Action接口
public enum AnimalEnum implements Action {
DOG("汪汪汪"){
@Override
public void show() {
System.out.println("I am a dog");
}
},
CAT("喵喵喵"){
@Override
public void show() {
System.out.println("I am a cat");
}
};
private String action;
AnimalEnum(String action) {
this.action = action;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public static void main(String[] args) {
AnimalEnum animalEnum= AnimalEnum.DOG;
animalEnum.show(); //I am a dog
}
}
由此更进一步证明,枚举类和普通类没啥区别,除开一些少许的限制外,可以把枚举类看作是一个普通类。
注解(Annotation)
jdk5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。注解就是代码里的特殊标记,这些标记可以在编译,类加载运行时被读取,并执行相应的处理。可以方便我们在不大范围修改代码逻辑的情况下,方便的使用这些数据。Annotation可以像修饰符一样,可修饰包,类,构造器,方法,成员变量,参数,局部变量的声明等。通常用@符合表示,jdk5内置了三种:@Override(限定重写父类的方法),@Deprecated(表示所修饰的方法,类已过时,不建议使用或者有其他替换的方案),@SuppressWarnings(关闭编译器的警告信息)
注解使用示例
注解通常在框架中频繁用到,比如SpringMVC,Servlet,以及SpringBoot中,基于注解开发,替换掉传统的配置文件。
- SpringMVC中
- SpringBoot
自定义注解
- 定义新的Annotation类型使用@interface关键字
- 自定义注解自动继承了java.lang.annotation.Annotation接口,Annotation的成员变量在Annotation定
- 义中以无参方法的形式声明。其方法名和返回值定义了该成员的名字和返回类型,我们称为配置参数。类型只能是8种基本类型、String类型,Class类型、enum类型、Annotation类型、以上所有类型的数组
- 可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字
- 如果只有一个参数成员,建议使用参数名为value
- 如果定义的注解含有配置参数,那么使用时必须制定参数值,除非它有默认值。格式是"参数名=参数值",如果只有一个参数成员,且名称为value,可以省略"value="
- 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
/**
* 自定义注解
*/
@Target({TYPE,METHOD,PARAMETER,})
@Retention(RetentionPolicy.RUNTIME)
public @interface XfAnnotation {
String value();
}
@Target
表示注解可以修饰的程序元素;@Retention
指定注解的生命周期,比如这里的RetentionPolicy.RUNTIME表示运行时起效
- 注解使用
@XfAnnotation(value = "xfnihao") //使用
public class Student{
private int id;
private String name;
public Student(int id,String name){
this.id=id;
this.name=name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
总结
了解枚举和注解的实现原理,我们知道枚举和普通类除了某些限制条件,其他都比较类似,而注解在框架中比较常见,通常搭配反射使用,才起到流程控制的作用。现在,我们只需暂时了解,并学会自定义某些注解即可。