枚举类和注解

枚举类和注解

1、当我们定义一组常量的时候我们强烈建议使用枚举类。

2、枚举类的理解:类的对象有有限个、确定的。

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

我们知道单例模式的实现方式有懒汉式和饿汉式,但是我们可以这样来实现单例模式(这种就是一种枚举类的思想)

class Singal{
    public final static Singal instance=new Singal();
}

只有一个属性并且不可以被修改(常量)

1、定义枚举类(自定义枚举类)

​ jdk5.0之前。

package com.geng;

public class SeasonTest {
    public static void main(String[] args){
        String str1=Season.AUTUMN.toString();
        String str2=Season.SPRING.toString();
        String str3=Season.SUMMER.toString();
        String str4=Season.WINTER.toString();
        System.out.println(str1+" "+str2+" "+str3+" "+str4);
    }
}
class Season{
    private final String seasonName;
    private final String seasonDesp;

    private Season(String seasonName, String seasonDesp) {
        this.seasonName = seasonName;
        this.seasonDesp = seasonDesp;
    }
    public final static Season SPRING=new Season("春天","春天真好");
    public final static Season SUMMER=new Season("夏天","夏天也好");
    public final static Season AUTUMN=new Season("秋天","秋天也行");
    public final static Season WINTER=new Season("冬天","冬天很好");

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

2、使用enum关键字

定义的枚举类默认继承于java.lang.Enum类

package com.geng;

public class SeasonTest {
    public static void main(String[] args){
        String str1=Season.AUTUMN.toString();
        String str2=Season.SPRING.toString();
        String str3=Season.SUMMER.toString();
        String str4=Season.WINTER.toString();
        System.out.println(str1+" "+str2+" "+str3+" "+str4);
    }
}

enum Season{
    SPRING("春天","春天真好"),
    SUMMER("夏天","夏天也好"),
    AUTUMN("秋天","秋天也行"),
    WINTER("冬天","冬天很好");

    private final String seasonName;
    private final String seasonDesp;


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

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesp='" + seasonDesp + '\'' +
                '}';
    }
}
java.lang.Enum类

枚举类和注解

package com.geng;

public class SeasonTest {
    public static void main(String[] args){
       Season season01=Season.AUTUMN;
        System.out.println(season01.toString());
        Season[] seasons=Season.values();
        for(Season season:seasons){
            System.out.println(season.toString());
        }
        System.out.println(Season.valueOf("WINTER"));
    }
}

enum Season{
    SPRING("春天","春天真好"),
    SUMMER("夏天","夏天也好"),
    AUTUMN("秋天","秋天也行"),
    WINTER("冬天","冬天很好");

    private final String seasonName;
    private final String seasonDesp;


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

/*    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesp='" + seasonDesp + '\'' +
                '}';
    }*/
}

枚举类和注解

枚举类实现接口。

package com.geng;

public class SeasonTest {
    public static void main(String[] args){
       Season season01=Season.AUTUMN;
       season01.show();
    }
}
interface Info{
    void 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 seasonDesp;


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

/*    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesp='" + seasonDesp + '\'' +
                '}';
    }*/
}

注解(Annotation)

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

注解就是代码里面的标记,通过这些标记我们可以在编译、类加载、运行时呗读取,并且执行相应的处理。可以用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明

框架=注解+反射+设计模式

生成文档相关的注解:

枚举类和注解

编译时格式检查的注解(jdk内置的三个基本注解):

枚举类和注解

eg:

@SuppressWarnings(”unused“)抑制变量未曾使用的警告

@SuppressWarnings({"unused","rawtypes"})抑制变量未曾使用和为添加泛型的警告

自定义注解:

1、定义新的注解(Annotation)类型使用@interface关键字

2、自定义注解继承了java.lang.annotation.Annotation接口

3、Annotation成员变量在Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称成员变量为配置参数。类型可以为几乎所有的java数据类型

4、我们可以使用default关键字为成员变量指定初始值

5、如果只有一个参数成员,建议使用value作为属性名

6、如果我们在使用注解的时候,如果只有一个参数成员且名称为value,那么可以直接指定值不用使用属性名

7、没有定义成员的Annotation为标记,包含成员的Annotation称之为元数据Annotation

自定义的注解要通过信息处理流程才会有意义(通过反射实现)

元注解(元注解)

​ jdk中的元注解用于修饰其他的Annotation定义,jdk5.0提供了4个标准的meta-Annotation,分别是

1、Retention

​ 只能修饰一个Annotation定义,用于指定该Annotation的生命周期,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention的时候必须为该(value)成员变量赋值

​ RetentionPolicy.SOURCE在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释

​ RetentionPolicy.CLASS(默认)在class文件中有效(即class保留),当运行java程序的时候,jvm不会保留注释

​ RetentionPolicy.RUNTIME在运行时有效(即运行时有效),当运行java程序的时候,程序可以通过反射获取该注解

枚举类和注解

2、Target

​ 用于指定被修饰的Annotation可以修饰哪些元素。

枚举类和注解

3、Documented

​ 用于指定被该元注解修饰的Annotation类将被javadoc工具提成为文档,默认情况下,javadoc是不会包括注解的(比如@Deprecated)

4、Inherited

修饰的Annotation将会具有继承性(某个类使用该注解进行修饰,它的子类自动具有该注解的效果)

jdk8新特性:

可重复注解:同一个注解修饰一个地方使用多次

类型注解:

枚举类和注解

元数据

​ 对现有数据进行修饰的数据,比如说String name=“gyp”;这个语句中,我们的现有数据是gyp,String和name都是对现有数据进行修饰,所以String和name就被称为元数据

上一篇:枚举类基本使用


下一篇:2019.9.14校内考试