Java-枚举

1,038 阅读1分钟

枚举简介

枚举定义的常量使代码更具可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。

public enum PizzaStatus {
    ORDERED,
    READY,
    DELIVERED;
}
public class Main {
    public static void main(String[] args) {
        System.out.println(PizzaStatus.DELIVERED.name()); // DELIVERED
        System.out.println(PizzaStatus.DELIVERED); // DELIVERED
    }
}

自定义枚举方法

public class Pizza {
    private PizzaStatus pizzaStatus;
    public enum PizzaStatus {
        ORDERED,
        READY,
        DELIVERED;
    }
    public boolean isDeliverable(){
        // 使用==比较枚举类型
        if(getPizzaStatus() == PizzaStatus.READY){
            return true;
        }
        return false;
    }
    public PizzaStatus getPizzaStatus() {
        return pizzaStatus;
    }
}

使用==比较枚举类型

  • 使用equals比较可能会出现空指针异常,而使用==则不存在
  • 使用equals比较两个不同枚举但字段相同的时候会返回true,但逻辑是false,而使用==则不会出现这种问题

枚举类型的属性,方法和构造函数

public class Pizza {
    private PizzaStatus status;
    public enum PizzaStatus {
        ORDERED(5) {
            @Override
            public boolean isOrdered() {
                return true;
            }
        },
        READY(2) {
            @Override
            public boolean isReady() {
                return true;
            }
        },
        DELIVERED(0) {
            @Override
            public boolean isDelivered() {
                return true;
            }
        };

        public boolean isOrdered() {
            return false;
        }

        public boolean isReady() {
            return false;
        }

        public boolean isDelivered() {
            return false;
        }

        private int timeToDelivered;

        PizzaStatus(int timeToDelivered) {
            this.timeToDelivered = timeToDelivered;
        }

        public int getTimeToDelivered() {
            return timeToDelivered;
        }
    }
    public void setStatus(PizzaStatus status) {
        this.status = status;
    }
    public boolean isDelivered() {
        return this.status.isReady();
    }
    public static void main(String[] args) {
        Pizza pizza = new Pizza();
        pizza.setStatus(PizzaStatus.READY);
        System.out.println(pizza.isDelivered());
    }
}

EnumSet and EnumMap

类似于HashSet和HashMap 用于枚举类型的集合工具

public static void main(String[] args) {
    EnumSet<PizzaStatus> unDelivered = EnumSet.of(PizzaStatus.READY, PizzaStatus.ORDERED);

    List<Pizza> pizzas = new ArrayList<>();

    Pizza pizza1 = new Pizza();
    pizza1.setStatus(PizzaStatus.READY);
    pizzas.add(pizza1);

    Pizza pizza2 = new Pizza();
    pizza2.setStatus(PizzaStatus.ORDERED);
    pizzas.add(pizza2);

    Pizza pizza3 = new Pizza();
    pizza3.setStatus(PizzaStatus.DELIVERED);
    pizzas.add(pizza3);

    // 过滤没有送达的Pizza
    List<Pizza> collect = pizzas.stream().filter(pizza -> unDelivered.contains(pizza.getStatus())).collect(Collectors.toList());

    System.out.println(pizzas);
    System.out.println(collect);

}

[Pizza{status=READY}, Pizza{status=ORDERED}, Pizza{status=DELIVERED}]
[Pizza{status=READY}, Pizza{status=ORDERED}]

实现设计模式

  • 单例模式
    枚举构造方法不能是public的,不能被外部调用,只能内部调用
public enum PizzaConfig {
    INSTANCE;
    public static PizzaConfig getInstance(){
        return INSTANCE;
    }
}
  • 策略模式
public enum PizzaDeliveryStrategy {
    EXPRESS {
        @Override
        public void deliver(Pizza pz) {
            System.out.println("Pizza will be delivered in express mode");
        }
    },
    NORMAL {
        @Override
        public void deliver(Pizza pz) {
            System.out.println("Pizza will be delivered in normal mode");
        }
    };

    public abstract void deliver(Pizza pz);
}