跳至主要內容

枚举&注解

holic-x...大约 4 分钟JAVAJAVA

枚举&注解

枚举

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");
    }
}

image-20240429151508543

@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