ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java 枚举

2022-04-02 12:32:20  阅读:152  来源: 互联网

标签:code java String Season 枚举 public name


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;
                }
            }
        }
    }
    

标签:code,java,String,Season,枚举,public,name
来源: https://www.cnblogs.com/ywjcqq/p/16091452.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有