Java 枚举和注解总结
枚举
没有枚举前我们基本上常量来定义值:
public interface Color{
public static final int GREEN = 0;
public static final int RED = 1;
....
....
....
}
如果有了枚举后我们会怎样了?
public enum Color{
GREEN,RED,BLACk,.......
}
代码是不是就清晰很多了?而且使用的时候输出的值我们是可以使用GREEN,是不是可以很明白的知道是什么颜色?
枚举的创建
枚举是继承自Enum
,使用enum
关键字。
枚举的使用场景
枚举适合在固定的常量下使用,比如四季,月份,星期;这种基本公认的而且不会有改变的场景下使用。
编译器中的枚举
编译器默认帮我们实现了很多枚举中的方法,比如equals(),hashCode(),toString,values(),valueOf(String)等。这些都是编译器帮我们做的。
枚举中的注意事项
- 不能使用static,final修饰枚举,因为它是隐式的final类型的;
- 因为是final类型,所以我们也就知道它是不能被继承的;
- 从Enum继承的clone是final类型的,枚举是不能重写clone方法的,并且Enum里面的clone方法直接抛出异常,所以enum是不能被clone的;
- enum中的ordinal是强依赖于枚举实例的定义顺序的,所以用ordinal来做判断顺序是不推荐的,因为只要在非最后加入实例,那么就会改变整体的顺序;如果是需要顺序可以自定义属性。
注解
注解出现前
注解的作用我理解为就是用来约定一些数据定义,让我们可以在某个属性或者某个地方做个标记。在注解出现前能做这个的应该是XML,我们通常在xml中定义类或者属性的相关配置。而有了注解我们可以在代码中直接定义了。
注解的分类
- 定义注解的注解,元注解:
@Rentation
,@Target
,@Document
,@Inherited
- jdk内置注解:
@Override
,@Deprecated
... - 自定义的注解
- spring等外部注解
作用场景:
@Rentation
:Source,Class,Runtime
作用目标域:
@Target
:Construct,Field,Local_variable,method,package,paramter,type
注解的定义
注解的定义使用@interface
关键字,并且使用元注解进行标注:
@Rentation(Rentation.Runtime)
@Target(ElementType.Field)
public @interface XxAnotation{
String values() default "";
}
注解属性
注解里面的属性只能使用以下6种类型来定义:
1. 所有的基本类型;
2. String
3. Class
4. enum
5. Annotation
6. 以上类型的数组类型
注解不允许使用基本类型的包装类来定义里面的注解属性。注解里面的属性都是使用方法的方式来定义的。有点类似接口方法。
注解的属性需要注意一下几点:
- 要么具有默认值,要么在使用注解的时候提供属性的值;
- 非基本类型的元素,默认值不能为null;
- 如果只有一个属性,那么可以设置为value,在使用注解的时候就可以直接赋值;
@XxAnotation("ok")
ps:注解是不能继承的。
注解处理器
我们定义了注解,设置了元素值。那么就必须要有一个处理器来进行注解处理。这个可以看看之前的Java 特殊字段脱敏,我们可以使用反射来获取注解定义的值,然后进行业务处理。