第八章:枚举类与注解
创始人
2024-05-30 04:22:18
0

第八章:枚举类与注解

8.1:枚举类的使用

​ 类的对象只有有限个确定的。我们称此类为枚举类。当需要定义一组常量是,强烈建议使用枚举类。如果枚举类中只有一个对象,则可以作为单例模式的实现方式。

  1. 如何定义枚举类

    • 方式一:JDK5.0之前,自定义枚举类。

      public class SeasonTest {public static void main(String[] args) {Season spring = Season.SPRING;System.out.println(spring); // Season{seasonName=春天,seasonDesc=春暖花开}}
      }
      //自定义枚举类
      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.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求1:提供toString()@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
      }
      
    • 方式二:JDK5.0,可以使用enum关键字定义枚举类。

      public class SeasonTest1 {public static void main(String[] args) {Season1 summer = Season1.SUMMER;System.out.println(summer); // Season{seasonName=春天,seasonDesc=春暖花开}System.out.println(Season1.class.getSuperclass()); // Enum}
      }
      //使用enum关键字枚举类
      enum Season1 implements Info{//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束SPRING("春天","春暖花开"),SUMMER("夏天","夏日炎炎"),AUTUMN("秋天","秋高气爽"),WINTER("冬天","冰天雪地");//2.声明Season对象的属性:private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season1(String seasonName,String seasonDesc){this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//4.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求1:提供toString()@Overridepublic String toString() {return "Season1{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
      }
      
  2. Enum类中常用的方法

    • values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
    • valueOf(String str):返回枚举类中对象名str的对象,如果没有就抛异常。
    • toString():返回当前枚举类对象常量名称。
    Season1 summer = Season1.SUMMER;
    //toString():返回枚举类对象的名称
    System.out.println(summer.toString());
    //values():返回所有的枚举类对象构成的数组
    Season1[] values = Season1.values();
    for(int i = 0;i < values.length;i++){System.out.println(values[i]);
    }
    //valueOf(String objName):返回枚举类中对象名是objName的对象。
    Season1 winter = Season1.valueOf("WINTER");
    System.out.println(winter);
    
  3. 使用enum关键字定义的枚举类实现接口的情况

    • 情况一:实现接口,在enum类中实现抽象方法。
    • 情况二:让枚举类的对象分别实现接口中的抽象方法。

8.2:注解

  1. 理解注解(Annotation)

    • JDK 5.0开始,Java增加了对元数据MetaData的支持,也就是Annotation(注解)。
    • Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
  2. 注解实例

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

      class Person{private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public void walk() {System.out.println("人走路");}
      }class Student extends Person{@Overridepublic void walk() {System.out.println("学生走路");}
      }
      
    • @Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择。

      @Deprecated
      public Date(int year, int month, int date) {this(year, month, date, 0, 0, 0);
      }
      
    • @SuppressWarnings:抑制编译器警告。

      @SuppressWarnings("unused")
      int num = 10;
      @SuppressWarnings({"unused", "rawtypes"})
      ArrayList list = new ArrayList();
      
  3. 自定义Annotation

    • 注解类型声明为:@interface
    • 自定义注解自动继承了java.lang.annotation.Annotation接口。
    • 注解的成员变量Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是八种基本数据类型、StringClassenumAnnotation类型。
    • 内部定义成员,通常使用value表示。
    • 可以指定成员的默认值,使用default定义。
    • 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是参数名 = 参数值,如果只有一个参数成员,且名称为value,可以省略value=
    • 如果自定义注解没有成员,表名是一个标识作用。
    public @interface MyAnnotation {String value() default "hello";
    }
    

    注意:自定义注解必须配上注解的信息处理流程才有意义。

  4. JDK中的元注解

    • JDK的元Annoation用于修饰其他Annotation定义。

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

      1. Retention

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

        • RetentionPolicy.COURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释。
        • RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行Java程序时,不会保留注解。这是默认值。
        • RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释。
      2. Target

        ​ 用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。
        在这里插入图片描述

      3. Documented

        ​ 用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。

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

      4. Inherited

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

  5. JDK 8中注解的新特性

    • 可重复注解

      1. MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
      2. MyAnnotationTargetRetention等元注解与MyAnnotations相同
      @Inherited
      @Repeatable(MyAnnotations.class)
      @Retention(RetentionPolicy.RUNTIME)
      @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
      public @interface MyAnnotation {String value() default "hello";
      }
      
      @Inherited
      @Retention(RetentionPolicy.RUNTIME)
      @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
      public @interface MyAnnotations {MyAnnotation[] value();
      }
      
      @MyAnnotation(value = "hi")
      @MyAnnotation(value = "abc")
      class Person{
      }
      
    • 类型注解

      1. ElementType.TYPE_RARAMETER:表示该注解能写在类型变量的声明语句中。
      2. ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。

相关内容

热门资讯

大屿山导游词 大屿山导游词  大屿山岛是香港特区最大的岛屿,其面积比香港岛大近一倍。位于珠江口外。大屿山地势西南高...
湖南天子山导游词 湖南天子山导游词  导语:导游词是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想,向游客...
重庆大足石刻导游词 重庆大足石刻导游词(精选11篇)  作为一名专门为游客提供帮助的导游,常常需要准备导游词,导游词事实...
安徽宏村景点导游词介绍 安徽宏村景点导游词介绍  作为一名旅游从业人员,就有可能用到导游词,导游词可以加深游客对景点的印象,...
庐山芦林湖导游词 庐山芦林湖导游词  作为一名导游,编写导游词是必不可少的,导游词具有注重口语化、精简凝练、重点突出的...
北海公园九龙壁的导游词 北海公园九龙壁的导游词范文  作为一名导游,时常要开展导游词准备工作,导游词是导游员在游览时为口头表...
介绍那拉提草原导游词 介绍那拉提草原导游词  那拉提”是蒙古语“太阳”的意思,对于名字的由来,有一个小小的传说。以下是“介...
江西省庐山山南太乙村导游词 江西省庐山山南太乙村导游词  各位游客,大家好!欢迎来到太乙村旅游。  去过庐山的人很多,但去过太乙...
旅游圣地大理苍山洱海导游词 旅游圣地大理苍山洱海导游词  作为一名优秀的旅游从业人员,就有可能用到导游词,导游词可以帮助旅游者欣...
蓬莱阁的导游词 蓬莱阁的导游词精选  尊敬的旅客朋友们,大家好啊!欢迎来到具有“人间仙境”美称的蓬莱阁参观旅游。我是...
断桥残雪导游词 断桥残雪导游词范文  在白堤的尽头,到了断桥,全长1公里的白堤就由此而“断”了。  断桥的名字最早取...
丽江概况导游词 丽江概况导游词(通用5篇)  作为一名专门为游客提供帮助的导游,时常需要编写导游词,导游词作为一种解...
故宫讲解导游词 2022故宫讲解导游词(精选23篇)  作为一位出色的导游人员,通常需要用到导游词来辅助讲解,借助导...
山西芮城永乐宫导游词 山西芮城永乐宫导游词  作为一位杰出的导游,往往需要进行导游词编写工作,导游词是导游员进行实地口语导...
杭州雷峰塔经典导游词 杭州雷峰塔经典导游词范文(精选3篇)  作为一位无私奉献的导游,时常要开展导游词准备工作,导游词由引...
兵马俑介绍导游词 兵马俑介绍导游词(通用17篇)  作为一名尽职尽责的导游,总归要编写导游词,借助导游词可以更好地宣传...
皇城相府的导游词 皇城相府的导游词  皇城相府导游词(一)女士们、先生们:  皇城相府位于山西省阳城县城东15公里的北...
三峡导游词 三峡导游词(15篇)  作为一名旅游从业人员,常常要根据讲解需要编写导游词,导游词一般是根据实际的游...
介绍乌镇的英文导游词 介绍乌镇的英文导游词  Wuzhen lies in the far north-east of Z...