一 枚举类

概述:类的对象的个数是有限个,确定的时候,此类就可以看作是枚举类。当需要定义一组常量时,强烈建议使用枚举类。 如果枚举类的对象只有一个,则枚举类可以看做单例模式的一种实现方式。

1)例子

  1. 星期:Monday(星期一)、......、Sunday(星期天)
  2. 性别:Man(男)、Woman(女)
  3. 季节:Spring(春节)......Winter(冬天)
  4. 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
  5. 就职状态:BusyFreeVocationDimission
  6. 订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Return(退货)、Checked(已确认)Fulfilled(已配货)
  7. 线程状态:创建、就绪、运行、阻塞、死亡

1.1 自定义枚举类

在JDK1.5之前,枚举类没诞生的时候

  1. public class SeasonTest {
  2. // 1.定义私有属性,private final
  3. private final String name;
  4. private final String desc;
  5. // 2.定义私有构造器
  6. public SeasonTest(String name, String desc) {
  7. this.name = name;
  8. this.desc = desc;
  9. }
  10. // 3.创建类对象 public static final
  11. public static final SeasonTest SPRING = new SeasonTest("春天", "春暖花开");
  12. public static final SeasonTest SUMMER = new SeasonTest("夏天", "夏暖花开");
  13. public static final SeasonTest AUTUMN = new SeasonTest("秋天", "秋暖花开");
  14. public static final SeasonTest WINNER = new SeasonTest("冬天", "冬暖花开");
  15. @Override
  16. public String toString() {
  17. return "SeasonTest{" +
  18. "name='" + name + '\'' +
  19. ", desc='" + desc + '\'' +
  20. '}';
  21. }
  22. public String getSEASON_NAME(){
  23. return SEASON_NAME;
  24. }
  25. public String getSEASON_DESC(){
  26. return SEASON_DESC;
  27. }
  28. }

1.2 使用enum定义枚举类

创建枚举类的对象,声明放在enum类的首位 声明枚举类的私有属性(private final) 创建私有的构造器

  1. public enum Seanson{
  2. PRING("春天", "春暖花开"),
  3. SUMMER("夏天", "夏暖花开"),
  4. AUTUMN("秋天", "秋暖花开"),
  5. WINNER("冬天", "冬暖花开");
  6. // 枚举类对象的属性
  7. private final String name;
  8. private final String desc;
  9. // 私有构造器
  10. private SeasonTest1(String name, String desc) {
  11. this.name = name;
  12. this.desc = desc;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public String getDesc() {
  18. return desc;
  19. }
  20. }

1.3 java.lang.Enum类中的常用方法

1)values():返回当前枚举类所有对象组成的数组
2)toString():返回枚举类对象的对象名
3)valuesOf(String name):返回指定对象名的枚举类对象,注意,如果找不到对象,则报异常:java.lang.IllegalArgumentException

1.4 实现接口的枚举类

  1. // 枚举类继承的接口
  2. interface Info{
  3. void show();
  4. }
  5. enum Season1 implements Info{
  6. SPRING("春天","春暖花开"){
  7. public void show(){
  8. System.out.println("春天在哪里?");
  9. }
  10. },
  11. SUMMER("夏天","夏日炎炎"){
  12. public void show(){
  13. System.out.println("宁静的夏天");
  14. }
  15. },
  16. AUTUMN("秋天","秋高气爽"){
  17. public void show(){
  18. System.out.println("秋天是用来分手的季节");
  19. }
  20. },
  21. WINTER("冬天","白雪皑皑"){
  22. public void show(){
  23. System.out.println("2002年的第一场雪");
  24. }
  25. };
  26. private final String SEASON_NAME;
  27. private final String SEASON_DESC;
  28. private Season1(String seasonName,String seasonDesc){
  29. this.SEASON_NAME = seasonName;
  30. this.SEASON_DESC = seasonDesc;
  31. }
  32. public String getSEASON_NAME() {
  33. return SEASON_NAME;
  34. }
  35. public String getSEASON_DESC() {
  36. return SEASON_DESC;
  37. }
  38. }

二 注解类

2.1 概述

1)注解(Annotation),也是 Jdk1.5 新增的特性。
2)Annotation 其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用 Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

2.2 应用举例

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

  1. @author 标明开发该类模块的作者,多个作者之间使用,分割
  2. @version 标明该类模块的版本
  3. @see 参考转向,也就是相关主题
  4. @since 从哪个版本开始增加的

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

  1. @Override:限定重写父类方法, 该注解只能用于方法
  2. @Deprecated:用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
  3. @SuppressWarnings:抑制编译器警告

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

2.3 元注解

元注解:用于修饰现有注解的注解

五个元注解

  1. @Retention:用于指定该 Annotation 的生命周期,属性value取值 RetentionPolicy 枚举类对象,SOURCE:编译不保留;CLASS(默认行为):编译保留,运行不保留;RUNTIME:编译保留,运行也保留
  2. @Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素。 使用ElementType枚举类对象限定
  3. @Documented:用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档
  4. @Inherited:被它修饰的 Annotation 将具有继承性。
  5. @Repeatable:可以让注解重复作用在目标上(JDK1.8新增)

    2.4 自定义注解

    1)所有的注解会自动继承 java.lang.annotation.Annotation,并不能继承别的类或是接口
    2)参数成员只能用 public 或默认(default)这两个访问权修饰
    3)参数成员只能用基本数据类型和 String、Enum、Class、annotations 数据类型,以及这一些类型的数组
    4)要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,除此之外没有别的获取注解对象的方法