• Enum枚举类解析


    Enum枚举类是java.lang包中的一个抽象类(abstract class Enum),实现了2个接口(Comparable<E>, Serializable)

    在单例模式设计中,枚举类是一种天然的单例,并且可以防止反序列化bug

    他有2个属性(name和ordinal),name就是枚举类的文本值,就是下面demo中的MAN和WOMAN,ordinal就是默认的int值,从0开始

    相对应的有2个方法返回属性的值,name()返回name属性的值,ordinal()返回ordinal属性的值

    所有的枚举类会自动继承Enum的构造方法

    protected Enum(String name, int ordinal) {
            this.name = name;
            this.ordinal = ordinal;
    }
    

      

    values()方法用于返回枚举类的所有实例的数组。

    SexEnum[] values = SexEnum.values();
    

      

    当然也可以给枚举类添加额外的属性,比如下面demo的desc属性(注意区别于枚举原有的name属性)

    一个简单的枚举类的demo

    package com.example.jdk.demo;
    
    import java.util.Arrays;
    
    public enum SexEnum {
    
        MAN("男人"),
        WOMAN("女人"),
    
        ;
        private String desc;
    
        public String getDesc() {
            return desc;
        }
    
        SexEnum(String desc) {
            this.desc = desc;
        }
    
        /**
         * 通过自定义属性获取枚举实例
         * @param desc
         * @return
         */
        public static SexEnum getbyDesc(String desc){
            SexEnum sexEnum = Arrays.stream(SexEnum.values())
                    .filter(k->k.getDesc().equals(desc))
                    .findAny().orElse(null);
            return sexEnum;
        }
    }
    

      

      

    使用枚举demo

    public class TestSexEnum {
    
        @Test
        public void test(){
    
            //abstract class Enum 枚举类是一个抽象类
    
            //测试Enum的name方法
            SexEnum[] values = SexEnum.values();
            for (SexEnum sex : values) {
                System.out.println(sex);//Enum的toString方法返回的就是name属性,也就是枚举类的文本值
                System.out.println(sex.ordinal());
                System.out.println(sex.name());
            }
            /*
            MAN
            0
            MAN
    
            WOMAN
            1
            WOMAN
             */
        }
    }
    

      

    普通文本值转换成枚举类实例

    @Test
    public void test1(){
    	SexEnum man = SexEnum.valueOf("MAN");
    //        SexEnum man = SexEnum.valueOf(SexEnum.MAN.name());
    	System.out.println(man.getDesc());//男人
    }
    

      

    通过自定义属性获取枚举实例

    /**
     * 通过自定义属性获取枚举实例
     * @param desc
     * @return
     */
    public static SexEnum getbyDesc(String desc){
    	SexEnum sexEnum = Arrays.stream(SexEnum.values())
    			.filter(k->k.getDesc().equals(desc))
    			.findAny().orElse(null);
    	return sexEnum;
    }
    

      

    注意findAny()返回的是一个Optional对象,直接调用他的get方法如果value是null的话,会报错"No value present"

    所有需要添加一个处理null的方法.orElse(null),而不是直接用get()

    public T get() {
    	if (value == null) {
    		throw new NoSuchElementException("No value present");
    	}
    	return value;
    }
    

      

    public T orElse(T other) {
    	return value != null ? value : other;
    }
    

      

    使用demo

    @Test
    public void test3(){
    	SexEnum man = SexEnum.getbyDesc("男人");
    	if (Objects.nonNull(man)){
    		System.out.println(man.getDesc());//男人
    		System.out.println(man.name());//MAN
    		System.out.println(man.ordinal());//0
    	}
    }
    

      

  • 相关阅读:
    flex布局
    redis持久化的四种方式
    list all index in elasticsearch
    Java Thread停止关闭
    关于线程的一些操作方法
    将redis key打印到文本
    spout和bolt
    java读取redis的timeout异常
    storm中,ack与fail
    好文要收藏(大数据)
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/16000268.html
Copyright © 2020-2023  润新知