Java 枚举类与注解

1、枚举类的使用

  • 类的对象只有有限个,确定的。
  • 当需要定义一组常量时,建议使用枚举类。
  • 两种定义方法
    • 自定义枚举类(JDK 5之前)
      • 步骤:
        • 定义private final属性
        • 定义private构造器,为属性赋予初值
        • 使用new,创建public static final对象
        • 重写toString(可选)
    • 使用enum关键字定义枚举类(JDK 5之后)
      • 定义的枚举类默认继承与java.lang.Enum类
      • 步骤:
        • 使用enum关键字修饰枚举类
        • 定义private final属性
        • 定义private构造器,为属性赋予初值
        • 使用对象名(属性值)定义枚举类对象,多个枚举类之间用逗号隔开,最后一个枚举类对象用分号结束。该语句放在类的开头。
public class Demo01 {

    public static void main(String[] args) {

        Season spring = Season.SPRING;

        System.out.println(spring);
    }
}


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("冬天","冰天雪地");

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

以上就是自定义枚举类

public class Demo01 {

    public static void main(String[] args) {

        Season spring = Season.SPRING;

        System.out.println(spring);
    }
}


enum Season{

    SPRING("春天","春暖花开"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","冰天雪地");

    private final String seasonName;
    private final String seasonDesc;

    private Season(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

}

以上就是enum关键字定义的枚举类

  • Enum类常用方法

    • values():返回枚举类型的对象数组,常用与遍历所有的枚举值。比如Season.values()
    • valueOf(String str):将一个字符串转换为同名的枚举类对象。比如Season.valueOf("WINTER")
    • toString():返回当前枚举类对象常量的名称。
  • 使用枚举类来实现接口,并利用匿名内部类根据不同对象重写不同的方法。

public class Demo01 {

    public static void main(String[] args) {

        Season spring = Season.SPRING;
        spring.show();
    }
}


enum Season implements Info {

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

    private final String seasonName;
    private final String seasonDesc;

    private Season(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

}

interface Info{
    void show();
}

2、注解(Annotation)

  • 代码里的特殊标记,比如@override
  • 注解实质上是一些补充信息,编译器可以通过这些信息进行验证或部署。
  • 可以修饰包、类、构造器、方法、成员变量、参数、局部变量
  • 框架 = 注解 + 反射 + 设计模式
  • 使用
    • 生成帮助文档的注解,比如@author, @return
    • 在编译时进行格式检查
      • @Override:重写父类方法
      • @Deprecated:表示已过时
      • @SuppressWarnings:抑制编译器警告
    • 跟踪代码依赖性,实现替代配置文件功能
  • 自定义注解(很少用)
    • 使用@interface关键字,比如public @interface MyAnnotation
    • 默认继承java.lang.annotation.Annotation接口
    • 配置参数的定义
      • 参数类型 参数名()的形式声明,参数类型只能是基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组、泛型类型T(JDK 8)。比如,String[] value()
      • 若指定初始值,可使用default关键字。比如String value() default "hello"
    • 若有配置参数,则使用时必须指定参数值,除非它有默认值。格式是@MyAnnotation(参数名 = 参数值),若只有一个参数,且名称为value,可以省略“value = ”。

元注解(meta-annotation)

  • 本身也是一个注解,用来对现有注解进行修饰
  • 有四个标准的元注解
    • Retention
      • 指定一个注解的声明周期
      • 有一个RetentionPolicy类型的成员变量,使用时为value指定以下值:
        • RetentionPolicy.SOURCE:在源文件中有效
        • RetentionPolicy.CLASS:在class文件中有效,默认
        • RetentionPolicy.RUNTIME:在运行时有效,可以通过反射获取
    • Target
      • 用来指定被修饰的Annotation能用于修饰哪些程序元素。枚举类ElementType中定义了一些常量。
    • Documented
      • 表示所修饰的Annotation在被javadoc解析时,保留下来。
    • Inherited
      • 被它修饰的注解,则其子类将自动具有该注解。可以用Class对象.getAnnotations()方法来查看所有注解。
//定义一个注解
//Target 表示我们的注解可以用在哪些地方
@Target(value={ElementType.METHOD,ElementType.TYPE})
//Retention 表示我们的注解在什么地方还有效
@Retention(value= RetentionPolicy.RUNTIME)
//Documented 表示是否将我们的注解生成在Javadoc中
@Documented
//Inherited 表示子类可以继承父类的注解
@Inherited
@interface MyAnnotation{

}
  • JDK 8 新特性
    • 可重复注解。
      • 其实这特性比较鸡肋,重复注解可以用注解的数组来替代,例如,定义了一个注解MyAnnotation,然后我们可以再定义一个注解MyAnnotations,里面的配置参数是MyAnnotation[] value即可。
    • 类型注解(Target注解中的可选的)
      • ElementType.TYPE_PARAMETER:表示该注解能写在类型变量的声明语句中,如:泛型。
      • ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值