枚举&注解
...大约 4 分钟
枚举&注解
枚举
1.枚举的引入
需求分析
要求创建季节Season对象,设定季节名称和描述,并完成春夏秋冬四个季节的初始化。最原始的做法定义一个Season,然后分别定义4个季节对象
public class Season {
public String name;
public String descr;
Season(String name, String descr) {
this.name = name;
this.descr = descr;
}
public static void main(String[] args) {
Season spring = new Season("spring", "春天来了");
Season summer = new Season("summer", "夏天好热");
Season autumn = new Season("autumn", "秋分凉爽");
Season winter = new Season("winter", "一夜入冬");
}
}
Season具备特点,季节的值是有限的4个(春夏秋冬),只读且不需要修改
枚举(enum/enumeration)是一组常量的集合,它可以理解为一种特殊的类,里面只包含一组有限的特定的对象。
改造方案1:引入自定义枚举
基于上述场景分析,Season可以引入枚举进行改造(引入自定义枚举),其核心思路:
- 不需要提供setter构造器,枚举对象通常为只读
- 对枚举对象使用final、static共同修饰,实现底层优化
- 枚举对象名一般使用全部大写(常量的命名规范)
- 枚举对象根据需求也可以有多个属性
public class CustomSeasonEnum {
public static void main(String[] args) {
System.out.println(CustomSeasonEnum.SPRING.getDecsr());
System.out.println(CustomSeasonEnum.SUMMER.getDecsr());
System.out.println(CustomSeasonEnum.AUTUMN.getDecsr());
System.out.println(CustomSeasonEnum.WINTER.getDecsr());
}
// 属性定义
private String name;
private String decsr;
// 构造函数私有化(防止直接new)
private CustomSeasonEnum(String aName, String aDecsr) {
this.name = aName;
this.decsr = aDecsr;
}
// 去掉setter(枚举通常为只读),仅提供getter
public String getName() {
return name;
}
public String getDecsr() {
return decsr;
}
// 在Season内部直接创建固定的对象(对象用大写常量规范定义),使用final static 修饰 优化底层实现
public static final CustomSeasonEnum SPRING = new CustomSeasonEnum("SPRING","春天");
public static final CustomSeasonEnum SUMMER = new CustomSeasonEnum("SUMMER","夏天");
public static final CustomSeasonEnum AUTUMN = new CustomSeasonEnum("AUTUMN","秋天");
public static final CustomSeasonEnum WINTER = new CustomSeasonEnum("WINTER","冬天");
}
改造方案2:使用enum关键字实现枚举
对比自定义枚举实现,enum关键字其实是基于自定义枚举的一种优化,通过约定规则简化枚举的定义,其构建思路其实和自定义枚举大同小异,需满足指定规范即可。其构建核心思路:
- 定义一组枚举数据(必须放在最前面)
- 枚举数据的修饰(public final static SeasonEnum A = new SeasonEnum ("xx","xx")可以简化为A("xx","xx")
- 属性定义、构造函数私有化(避免new操作)
- 取消setter、提供getter(枚举一般是只读)
- 如果调用无参构造器初始化,则括号可以省略(例如SPRING,SUMMER,)
注解
1.基本概念
使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素
三个基本的 Annotation:
- @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
- @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
- @SuppressWarnings: 抑制编译器警告
@Override
一般场景用于子类继承父类重写父类方法
public class OverrideDemo {
public static void main(String[] args) {
Son son = new Son();
son.fly();
}
}
class Father{
public void fly(){
System.out.println("父类 fly方法");
}
}
class Son extends Father{
@Override
public void fly(){
System.out.println("子类 fly方法");
}
}
@Override
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
结合源码记忆@Override的作用
- 只能作用于方法(看源码的@Target属性,@Target是修饰注解的注解成为元注解)
- @Override表示显示指定重写的父类(从编译层验证),如果父类没有要重写的方法就会报错
- 如果子类和父类满足重写规则,就算不加@Orerride仍然构成重写
@Deprecated
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时。可以修饰方法、类、字段、包、参数等信息,一般在版本升级过渡时使用
例如此处标记A类以过期,此时如果在方法中使用A则会提示如下(表示A已经过期),但是A类还是可以正常使用的
public class DeprecatedDemo {
public static void main(String[] args) {
A a = new A();
a.test();
}
}
// 使用@Deprecated标识这个类已经过期
@Deprecated
class A{
public void test(){
System.out.println("testing");
}
}
@SuppressWarnings
@SuppressWarnings: 抑制编译器警告
类型 | 说明 |
---|---|
unchecked | 忽略没有检查的警告 |
rawtypes | 忽略没有指定泛型的警告(传参时没有指定泛型的警告错误) |
unused | 忽略没有使用某个变量的警告错误 |
@SuppressWarnings 可以修饰的程序元素为,查看@Target 源码
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
元注解
JDK 的元 Annotation 用于修饰其他 Annotation
元注解种类(在看代码的时候可以关注)
- Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
- Target // 指定注解可以在哪些地方使用
- Documented //指定该注解是否会在 javadoc 体现
- Inherited //子类会继承父类注解
Powered by Waline v3.1.3