• java 枚举


    java-枚举

    枚举的英文(enumeration,简称 enum),是一组常量的集合,属于一种特殊的类,里面只包含一组有限的特定的对象。

    枚举实现方式
    • 自定义类实现枚举

      class Season {
          public final static Season SUMMER = new Season("夏天");
      
          public final static Season WINTER = new Season("冬天");
      
          private String name;
      
          private Season(String name)
          {
              this.name = name;
          }
      
          public String getName() {
              return name;
          }
      }
      

      注意事项:

      1. 构造器私有化
      2. 不提供setXxx方法,枚举对象保持只读。
      3. 对枚举对象/属性使用final+static共同修饰,实现底层优化(我们直接使用final 修饰的静态属性的时候,不会导致类被加载。
      4. 枚举对象名通常全部使用大写,常量的命名规范。
      5. 枚举对象根据需要,可以有多个属性。
    • enum关键字实现枚举

      package com.smile.cms.enums;
      
      public enum Season {
          SUMMER("夏天"),
          WINTER("冬天");
      
          private String name;
      
          private Season(String name)
          {
              this.name = name;
          }
      
          public String getName() {
              return name;
          }
      }
      
    枚举实现的本质

    java.lang.Enum类声明

    public abstract class Enum<E extends Enum<E>>
            implements Constable, Comparable<E>, Serializable
    

    编译Season类,生成Season.class

    javac Season.java
    

    反编译Season.class

    javap Season.class
    
    Compiled from "Season.java"
    public final class com.smile.cms.enums.Season extends java.lang.Enum<com.smile.cms.enums.Season> {
      public static final com.smile.cms.enums.Season SUMMER;
      public static final com.smile.cms.enums.Season WINTER;
      public static com.smile.cms.enums.Season[] values();
      public static com.smile.cms.enums.Season valueOf(java.lang.String);
      public java.lang.String getName();
      static {};
    }
    

    从上面可以看出,枚举的本质是java.lang.Enum的子类。尽管enum是一种受限制的类,并且具有自己的方法。枚举这种特殊的类,因为被修饰为final,所以不能继承其他的类。

    枚举的方法

    创建一个枚举

    package enums;
    
    public enum Season {
        WINTER("冬天"),
        SUMMER("夏天");
    
        private String name;
    
        Season(String name){
            this.name = name;
        }
    
        public String getName() {
            return this.name;
        }
    }
    
    • values 返回enum实例的数组

      public class Application {
          public static void main(String[] args) {
              Season[] seasons = Season.values();
      
              for (Season season : seasons) {
                  System.out.println(season.getName());
              }
          }
      }
      

      输出结果:冬天 夏天

    • name返回实例名

      public class Application {
          public static void main(String[] args) {
              System.out.println(Season.SUMMER);
          }
      }
      

      输出结果:SUMMER

    • ordinal返回实例声明时的次序,从0开始

      public class Application {
          public static void main(String[] args) {
              System.out.println(Season.WINTER.ordinal());
              System.out.println(Season.SUMMER.ordinal());
          }
      }
      

      输出结果:0 1

    • getDeclaringClass返回实例所属的enum类型

      public class Application {
          public static void main(String[] args) {
              System.out.println(Season.WINTER.getDeclaringClass());
          }
      }
      

      输出结果:class enums.Season

    • equals判断是否为同一个对象

      public class Application {
          public static void main(String[] args) {
              System.out.println(Season.WINTER.equals(Season.WINTER));
          }
      }
      

      输出的结果:true

    • valueOf根据字符串获取到实例

      public class Application {
          public static void main(String[] args) {
              System.out.println(Season.valueOf("SUMMER").getName());
          }
      }
      
    枚举的特性

    除了不能继承,基本上可以将enum看做一个常规的类

    基本特性
    • 枚举对象放置在代码的最前面

    • 多个枚举对象通过,进行展示,最后一个枚举对象以;结束

    • 枚举值默认从0开始的有序数值

    • 枚举可以添加普通方法静态方法抽象方法构造方法

      package enums;
      
      public enum ResponseCode {
          SUCCESS(200){
              @Override
              public String getDescription() {
                  return "成功";
              }
          };
      
          private int code;
      
        	//构造方法
          private ResponseCode(int code){
              this.code = code;
          }
      
        	//普通方法
          public int getCode() {
              return code;
          }
      
        	//抽象方法
          public abstract String getDescription();
      }
      
    • 枚举可以实现接口

      package enums;
      
      public interface ICode {
          public int getCode();
      }
      
      package enums;
      
      public enum ResponseCode implements ICode{
          SUCCESS(200){
              @Override
              public String getDescription() {
                  return "成功";
              }
          };
      
          private int code;
      
          private ResponseCode(int code){
              this.code = code;
          }
      
          public int getCode() {
              return code;
          }
      
          public abstract String getDescription();
      }
      
    • 枚举不可以继承

      • enum不能被继承

        enum 类底层被修饰成final

      • enum不能继承

        enum 类底层,已经继承了java.lang.Enum

      public final class com.smile.cms.enums.Season extends java.lang.Enum<com.smile.cms.enums.Season>
      
    枚举的使用
    • 组织常

    • switch状态判断

      public static String getTrafficInstruct(Signal signal) {
        String instruct = "信号灯故障";
        switch (signal) {
          case RED:
            instruct = "红灯停";
            break;
          case YELLOW:
            instruct = "黄灯请注意";
            break;
          case GREEN:
            instruct = "绿灯行";
            break;
          default:
            break;
        }
        return instruct;
      }
      
    • 状态码

    • 组织枚举

      可以将类型相近的枚举通过接口或类组织起来,但是一般用接口进行组织。

      package enums;
      
      
      public class ResponseCode {
          public interface ICode{
              int getCode();
      
              String getMessage();
          }
      
          public interface Code{
              enum HttpCode implements ICode{
                  SUCCESS(200,"接口请求成功"),
                  ERROR(400,"接口请求失败");
      
                  HttpCode(int code,String message){
                      this.code = code;
      
                      this.message = message;
                  }
      
                  private int code;
      
                  private String message;
      
                  @Override
                  public int getCode() {
                      return code;
                  }
      
                  @Override
                  public String getMessage() {
                      return message;
                  }
              }
      
              enum CustomerCode implements ICode{
                  ERROR_LOGIN(50001,"登陆异常");
      
                  private int code;
      
                  private String message;
      
                  CustomerCode(int code,String message){
                      this.code = code;
      
                      this.message = message;
                  }
      
                  @Override
                  public int getCode() {
                      return code;
                  }
      
                  @Override
                  public String getMessage() {
                      return message;
                  }
              }
          }
      }
      
  • 相关阅读:
    [PHP] yield沟通函数循环内外
    [Linux] scp本地服务器和远程服务器拷贝文件
    [Linux] 大数据库导出大文件统计并去重
    [Go] golang连接查询mysql
    [日常] 解决mysql不允许外部访问
    [Go] golang创建目录写文件判断文件
    [日常] imap协议读取邮件
    [Go] golang使用github里的imap类库
    [Go] golang无缓冲通道实现工作池控制并发
    [Go] golang的range循环遍历通道
  • 原文地址:https://www.cnblogs.com/ywjcqq/p/16091452.html
Copyright © 2020-2023  润新知