枚举类和注解

枚举类

枚举用于类的对象个数有限且确定,例如:

​ 性别:男,女

​ 星期:星期一,星期二,、、、

​ 季节:春、夏、秋、冬

​ 、、、、、

当需要定义一组常量时,强烈建议使用枚举类

如果枚举类只有一个对象,则可以作为单利模式的实现方式

创建方法

如何定义枚举类
方式一:JDK 5.0之前,自定义枚举类
方拾二:JDK 5.0之后可以用enum关键字定义枚举类

方法一 、自定义枚举类

public class SeasonTest {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);
    }
}
//自定义枚举类
class Season{
    //1,声明Season对象的属性:属性为常量,需用private final定义
    private final String seasonName;
    private final String seasonDesc;

    //2,私有化类的构造器,并给对象属性赋值
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3, 提供当前枚举类的多个对象,作为常量且不可变,故应该用public static final修饰
    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("冬天","冰天雪地");

    //4.其他诉求,获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
    //4, 其他诉求,提供toString()
    //该类继承于object类,toString()方法返回的是地址,故可以按需重写tostring()方法

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

方法二、enum关键字实现枚举类

package javaSE.Enum;

/**
 * 使用enum关键字定义枚举类
 * 说明:定义的枚举类默认继承于java.lang.Enumle。其toString()方法返回的
 * 是枚举类中的对象变量名可虫子额toString()方法打印需要的内容
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 spring = Season1.SPRING;
        System.out.println(spring);

    }
}

//自定义枚举类
enum  Season1{

    //1, 提供枚举类的对象
    SPRING ("春天","春暖花开"),
    SUMMER ("夏天","夏日炎炎"),
    AUTUMN ("秋天","秋高气爽"),
    WINTER ("冬天","冰天雪地");
    //enum实现枚举,对象放在最开始,且不同对象之间用逗号隔开且最后用分号

    //2,声明Season对象的属性:属性为常量,需用private final定义
    private final String seasonName;
    private final String seasonDesc;

    //3,私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }



    //4.其他诉求,获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
    //4, 其他诉求,提供toString()

     @Override
    public String toString() {//重写toString()方法
        return "Season1{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

enum类的主要方法

values()方法:返回枚举类型的对象数组,该方法可以很方便的遍历枚举值

valueof(String str):可以把一个字符串转为对应的枚举对象,要求字符串必须是枚举类对象的“名字”,如果不是会有运行时异常

toString():返回当前枚举类对象常量的名字

package javaSE.Enum;

/**
 * 使用enum关键字定义枚举类
 * 说明:定义的枚举类默认继承于java.lang.Enumle。其toString()方法返回的
 * 是枚举类中的对象变量名可虫子额toString()方法打印需要的内容
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 spring = Season1.SPRING;
        //tostring()
        System.out.println(spring);
        System.out.println("************************");

        //values();
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }

        System.out.println("************************");
        Thread.State[] values1 = Thread.State.values();
        for (int i = 0; i < values1.length; i++) {
            System.out.println(values1[i]);
        }

        System.out.println("************************");
        //valueof(string str);返回一个枚举对象名是str的对象
        //如果没有str的枚举类对象会抛出IllegalArgumentException异常

        Season1 winter = Season1.valueOf("WINTER");
        System.out.println(winter);

    }
}

//自定义枚举类
enum  Season1{

    //1, 提供枚举类的对象
    SPRING ("春天","春暖花开"),
    SUMMER ("夏天","夏日炎炎"),
    AUTUMN ("秋天","秋高气爽"),
    WINTER ("冬天","冰天雪地");
    //enum实现枚举,对象放在最开始,且不同对象之间用逗号隔开且最后用分号

    //2,声明Season对象的属性:属性为常量,需用private final定义
    private final String seasonName;
    private final String seasonDesc;

    //3,私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }



    //4.其他诉求,获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
    //4, 其他诉求,提供toString()

//     @Override
//    public String toString() {//重写toString()方法
//        return "Season1{" +
//                "seasonName='" + seasonName + '\'' +
//                ", seasonDesc='" + seasonDesc + '\'' +
//                '}';
//    }
}

使用enum关键字实现的枚举类实现接口的情况

情况一

​ 和普通类实现接口一样,在enum类中实现抽象方法

interface Info{
    void show ();
}

//自定义枚举类
enum  Season1 implements Info{
    
    SPRING ("春天","春暖花开"),
    SUMMER ("夏天","夏日炎炎"),
    AUTUMN ("秋天","秋高气爽"),
    WINTER ("冬天","冰天雪地");
    
    private final String seasonName;
    private final String seasonDesc;
    
    private Season1(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
   

    @Override
    public void show() {
        System.out.println("这是一个季节");
    }
}

情况二

情况一中每一个枚举类对象调用接口实现方法所执行的步骤都相同,如果想让每一个枚举类对象调用接口实现对象时执行不同的操作,则可以让每一个对象都实现一下该接口方法,如下

interface Info{
    void show ();
}

//自定义枚举类
enum  Season1 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 Season1(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

注解

概述

	从JDK 5.0开始,java增加了对元数据(MetaData)的支持,也就是Annotation(注解)

​ Annotation其实就是代码里的特殊标记,程序员可以通过Annotation在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

​ Annotation可以像修饰符一样使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name = value”对中。

示例一、生成相关文档的注解

@author

@version

@see;参考主题,也是相关主题

@since;从那个版本开始增加

@param;对方法中的参数的说明,如果没有参数就不能写

@return对方法返回值的说明,如果返回值是void就不能写

@exception;对方法抛出的异常进行说明,如果方法没有用throw显示抛出异常就不能写

​ 其中

​ @param、@return、@exception只能用在方法中

​ @param格式要求: @param形参名 形参类型 形参说明

​ @return格式要求: @return 返回值类型 返回值说明

​ @exception的格式要求:@exception 异常类型 异常说明

​ @param和@exception可以并列多个

示例二、在编译时进行格式检查(JDK内置的三个基本注解)

​ @Override;限定重写父类方法,该注解只用于方法

​ @Deprecated;用于表示所修饰元素(类、方法等)已过时,通常是因为所修饰的结构危险或存在更好的选择

​ @SupressWarnings;抑制编译器警告

示例三,跟踪代码的依赖性,实现替代配置文件功能

自定义注解

自定义注解必须配上注解的信息处理流程(使用反射)才有意义

在这里插入图片描述

package javaSE.Annotation;

/**
 * 自定义注解
 *  注解生命为 @interface
 *  内部定义成员,通常使用value使用
 *  可以指定成员的默认值,使用default定义
 *  如果自定义注解没有成员,表明是一个标识作用
 *
 * @Author: Thewind
 * @Date: 2021/1/25 22:22
 */
public @interface MyAnnotation {

    // String value();
    // 此方法设置默认值,其调用方法为 @MyAnnotation(value = " hello")


    String value() default "hello";
    //此方法设置了默认值,其调用方法为@MyAnnotation()
    //但是也可以使用@MyAnnotation(value = " 其他值")

}

JDK中的元注解

JDK的元Annotation是用于修饰其他的Annotation定义

JDK 5.0提供了4个标准的meta-annotation类型,分别是

Retention

Target

Documented

Inherited

自定义注解时通常会指明两个元注解,@Retention和@Target

Retention

指定所修饰的Annotationd的生命周期,

在这里插入图片描述

Target

用于指示被修饰的Annotation 能用于修饰那些程序元素

//使用方法 @Target(ElementType.常量)
//或者@Target({常量,常量,常量,.....})


//ElementType类的定义
public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}

Documented

用于指定所修饰的Annotation注解将被javaDoc解析时会被保留下来

注意:定义为Documented 的注解必须设置Retention为RUNTIME

Inherited

它所修饰的注解将具有继承性,即如果某个类使用了被@Inherited修饰的注解,其子类将自动具有该注解

通过反射获取注解信息

反射章节再具体介绍

JDK 8 中注解的新特性

可重复注解

注解可重复注解多次

​ 说明:MyAnnotations,和MyAnnotation是自定义注解类

​ 1,在MyAnnotation 上声明 @Repeatable,成员值为MyAnnotation.class

2,MyAnnotation的 Target和Retention和MyAnnotations相同

类型注解

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值