java枚举类型

一. 枚举类型的定义

  1. 定义

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


pubulic abstract class Enum> implements Comparable, 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 [email protected]

* @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> 为何这样定义? 暂不理解, 以后补充。

你可能感兴趣的:(java枚举类型)