枚举简介
枚举定义的常量使代码更具可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。
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);
}