美文网首页
java枚举类型

java枚举类型

作者: 顺利_4364 | 来源:发表于2019-01-15 09:44 被阅读0次

    一. 枚举类型的定义

    1. 定义

    java.lang.Enum是在JDK1.5定义的. 定义为:

    
    pubulic abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable{...}
    
    
    1. 编程规约:

    阿里巴巴出品的编程规约

    [参考]枚举类名建议带上Enum后缀, 枚举成员名称需要全大写, 单词间用下划线隔开。

    说明: 枚举其实就是特殊的常量类, 且构造方法被默认和强制是私有。

    正例: DealStatusEnum, 成员名称: SUCCESS/UNKOWN_REASON

    二. 枚举的使用

    1. 基本使用
    
    public enum RainBowEnum {
    
        RED, ORANGE, YELLEOW, GREEN, BLUE
    
        }
    
    
    1. 用法升级. 增加自定义方法
    
    public enum RainBow2Enum {
    
        RED(0, "彩虹-红色"),
    
        ORANGE(1, "彩虹-橙色"),
    
        YELLEOW(2, "彩虹-黄色"),
    
        GREEN(3, "彩虹-绿色"),
    
        BLUE(4, "彩虹-蓝色");
    
        RainBow2Enum(int flag, String name) {
    
            this.flag = flag;
    
            this.name = name;
    
        }
    
        private int flag;
    
        private String name;
    
    }
    
    

    可以枚举实例

    public enum ObjectEnum {
        OBJECT{
            @Override
            public User getUser() {
                return new User("李四", "北京西路");
            }
        },OBJECT2{
            @Override
            public User getUser() {
                return new User("小明");
            }
        };
        
        private User user;
    
        ObjectEnum() {
            this.user = new User();
        }
        
        public abstract User getUser() ;
    }
    
    1. 可以实现接口, 不能继承接口. 也不能被继承. 是final的.
    2. 可以定义接口组织枚举.
    
    /**
    
    * @author xql132@zcsmart.com
    
    * @date 2019/1/14 17:40
    
    * @description
    
    */
    
    public interface OrgnizeEnums {
    
        // 自定义水果枚举
    
        enum FruitEnum implements OrgnizeEnums{
    
            PEACH, GRAPE
    
        }
    
        // 自定义酒枚举
    
        enum WineEnum implements OrgnizeEnums{
    
            READ_WINE, SPIRIT
    
        }
    
    }
    
    class testOrgnizeEnums{
    
        public static void main(String[] args) {
    
            for (OrgnizeEnums.FruitEnum fruitEnum : OrgnizeEnums.FruitEnum.values()){
    
                System.out.println("fruitEnum::"+fruitEnum);
    
            }
    
            for (OrgnizeEnums.WineEnum wineEnum : OrgnizeEnums.WineEnum.values()){
    
                System.out.println("wineEnum::"+wineEnum);
    
            }
    
        }
    
    }
    
    
    1. 枚举集合的使用

    EnumSet的元素不允许为null, EnumSet非线程安全

    EnumMap的key不允许为null,value可以为null,按照key在enum中的顺序进行保存,非线程安全。

    1. 枚举实现单例模式

    经典案例

    public enum SingletonEnum {
        INSTANCE;
        public void otherMethods() {
            System.out.println("Something");
        }
    }
    

    举个例子

    // 枚举类
    public enum DemoEnum {
        // 理解: INSTANCE是DemoEnum的实例.
        INSTANCE;
    
        // 定义INSTANCE包含参数User.
        private User instance;
    
        // 枚举类的私有构造方法. 默认是private的.
         DemoEnum() {
            instance = new User();
        }
    
        // 获取枚举类的具体参数user
        public User getInstance() {
            return instance;
        }
    
    }
    
    @Data
    @Slf4j
    public class User {
        private String name;
        private String address;
    
        public User() {
        }
    
        public User(String name) {
            this.name = name;
        }
    
        public User(String name, String address) {
            this.name = name;
            this.address = address;
        }
    
        public static void main(String[] args) {
            // 心得-定义 User类可以用new User();获取很多不同的实例对象. 枚举是列举出有穷序列集.
            // 定义枚举类, 里面只列举出一个值, 此值代表一个User类的实例. 通过getInstance()方法可以获取到INSTANCE的值: 一个User类的实例.
            // Enum: 自由序列化, 线程安全, 保证单例
            // Enum是由class实现的->enum作为一个类来实现单例;
            // Enum是通过继承Enum类实现的, enum不能作为子类继承其他类.也不能被继承, 是final修饰的. 但是可以用来实现接口
            // Enum有且仅有private的构造器. 防止外部的额外构造.
            User user1 = DemoEnum.INSTANCE.getInstance();
            User user2 = DemoEnum.INSTANCE.getInstance();
            User user3 = DemoEnum.INSTANCE.getInstance();
            User user4 = DemoEnum.INSTANCE.getInstance();
            log.info("获取的实例哈希值:{}", user1.hashCode());
            log.info("获取的实例哈希值:{}", user2.hashCode());
            log.info("获取的实例哈希值:{}", user3.hashCode());
            log.info("获取的实例哈希值:{}", user4.hashCode());
        }
    }
    

    三、枚举原码理解

    Enum<E extends Enum<E>> 为何这样定义? 暂不理解, 以后补充。

    相关文章

      网友评论

          本文标题:java枚举类型

          本文链接:https://www.haomeiwen.com/subject/aesedqtx.html