Java教程

java 枚举

本文主要是介绍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;
                }
            }
        }
    }
    
这篇关于java 枚举的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!