Java 中的枚举类和注解

2021-06-09 06:02

阅读:689

标签:type   编译器   retention   开发者   new   img   返回   variable   属性   

Java 中的枚举类和注解

1. 枚举类的使用

当需要定义一组常量时,强烈建议使用枚举类。要求类的对象是有限个且是确定的。例如:星期、性别、季节、支付方式...

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

如何自定义枚举类(JDK5.0之前)

  1. 声明枚举类对象的属性。
  2. 创建私有化构造器。
  3. 定义枚举类对象。
技术图片技术图片
package com.summer.java;

/**
 * @Author 安宁侯
 * @create 2021-03-08 6:27
 */
public class MyEnum {
    public static void main(String[] args) {
        Season season1 = Season.SPRING;
        System.out.println(season1);
    }

}
//自定义枚举类
class Season{
    //1.声明season对象的属性
    private final String name;
    private final String desc;
    //2.私有化构造器
    private Season(String name,String desc){
        //3.为属性赋值
         this.name=name;
         this.desc=desc;
    }
    //4.定义枚举类的对象: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("冬天","寒冷");

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name=‘" + name + ‘\‘‘ +
                ", desc=‘" + desc + ‘\‘‘ +
                ‘}‘;
    }
}
自定义枚举类

如何使用关键字enum自定义枚举类(JDK5.0)

  1. 声明枚举类对象。
  2. 声明属性。
  3. 创建私有化构造器
技术图片技术图片
package com.summer.java;

/**
 * @Author 安宁侯
 * @create 2021-03-08 6:46
 */
public class MyEnum1 {
    public static void main(String[] args) {
        MySeason spring = MySeason.SPRING;
        System.out.println(spring);
    }
}
/*
使用enum定义枚举类时,默认继承于java.lang.enum
 */
enum MySeason{
    //1.提供当前枚举类的对象,多个对象值之间用逗号隔开,最后一个用分号结尾
    SPRING("春天","温暖"),
    SUMMER("..",".."),
    AUTUMN("..",".."),
    WINTER("..","..");
    private final String name;
    private final String desc;
    //2.私有化构造器
    private MySeason(String name,String desc){
        //3.为属性赋值
        this.name=name;
        this.desc=desc;
    }

    @Override
    public String toString() {
        return "MySeason{" +
                "name=‘" + name + ‘\‘‘ +
                ", desc=‘" + desc + ‘\‘‘ +
                ‘}‘;
    }
}
使用enum定义枚举类

Enum类的主要方法

values():返回枚举类型的对象数组。可以很方便的获取到所有的枚举值

valueOf(String str):把一个字符串转成对应的枚举类对象。(根据指定名找到枚举类对象,返回该对象的对象名。如果找不到,则会报异常)

toString():返回当前枚举类对象的名称

技术图片技术图片
public class MyEnum1 {
    public static void main(String[] args) {
        MySeason spring = MySeason.SPRING;
        //toString
        System.out.println(spring);
        //values
        for (int i = 0; i ) {
            System.out.println(MySeason.values()[i]);
        }
        //valueOf
        System.out.println(MySeason.valueOf("WINTER"));
    }
}
主要方法

实现接口的枚举类

 

技术图片技术图片
       //valueOf
        System.out.println(MySeason.valueOf("WINTER"));
        MySeason.AUTUMN.show();
    }
}
/*
使用enum定义枚举类时,默认继承于java.lang.enum
 */
interface Info{
    void show();
}
enum MySeason implements Info{
    //1.提供当前枚举类的对象,多个对象值之间用逗号隔开,最后一个用分号结尾
    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 name;
    private final String desc;
    //2.私有化构造器
    private MySeason(String name,String desc){
        //3.为属性赋值
        this.name=name;
        this.desc=desc;
    }

}
每个对象都可以实现接口方法

 

2. 注解的使用

常见的annotation示例

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

@author:开发者的名称,多个开发者之间用逗号隔开

@version:当前模块的版本

@see:参考转向,也就是相关主题

@since:从哪个版本开始增加的

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

@return:对返回值的说明,如果没有返回值就不能写

@exception:对异常的说明,如果异常没有经过throws显示抛出就不能写

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

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

@Deprecated:表明所修饰的元素(类、方法)已经过时

@SuppressWarnings:抑制编译器警告

示例三:跟踪代码的依赖性,实现替代配置文件的功能。例如:@WebServlet、@Transactional、@Test...

自定义Annotation

  1. 注解声明为@interface
  2. 内部定义成员,通常使用value表示
  3. 可以指定成员的默认值,使用default定义
  4. 如果自定义注解没有成员,表明是一个标识作用
技术图片技术图片
//@MyAnnotation(value = "hello")//使用注解
    @MyAnnotation//此时使用的是默认值hello
public @interface MyAnnotation {//1.声明注解类
    String value() default "hello";
}
自定义注解

自定义注解必须配上自定义注解流程(使用反射)才有意义。通常都会指定Retention和Target两个注解

JDk中的4种元注解

元注解:用来修饰其他注解的注解。JDK5.0提供了四种mate-annotation。

Retention:只能用来修饰一个annotation定义,用于指定该annotation的生命周期,@Retention包含了一个RetentionPolicy类型的成员变量,使用@Retention注解时必须为该value成员变量指定值。

RetentionPolicy的值:

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

RetentionPolicy.CALSS:在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注释。该值是RetentionPolicy的默认值

RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释。

Target:只能用来修饰一个annotation定义,用于指定该annotation能用来修饰哪些程序元素。@Target也包含了一个名为value的成员变量。

TYPE:可以用来修饰类

FIELD:可以用来修饰属性

METHOD:可以用来修饰方法

PARAMETER:可以用来修饰形参

CONSTRUCTOR:可以用来修饰构造器

LOCAL_VARIABLE:可以用来修饰局部变量

Documented:用于指定被该Annotation修饰的annotation类可以被javadoc工具提取成文档。默认情况下,javadoc是不包含注解的。

定义为Documented的注解必须设置Retention的值为RUNTIME。

Inherited:被该注解修饰的annotation将具有继承性。如果某个类使用了被Inherited修饰的注解,其子类将自动拥有该注解

JDK8中的注解新特性

可重复注解:可重复定义多个的注解

在自定义的Myannotation上使用注解@Repeatable,成员值为MyAnnotation.class。

MyAnnotation的Target和Retention与MyAnnotation相同。

类型注解:

ElementType.TYPE_PARAMETER:表示该注解能写在类型变量的声明语句中。

ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。

Java 中的枚举类和注解

标签:type   编译器   retention   开发者   new   img   返回   variable   属性   

原文地址:https://www.cnblogs.com/summerHou/p/14497682.html


评论


亲,登录后才可以留言!