那可太多了。
枚举的作用绝不仅仅是代替传统的常量,更重要的意义是简化了有限可穷举的元素对象的定义。说白了,就是写代码省事儿了。
但是吧,枚举并不只是那么简单,下面我结合几个示例给你演示一下真实开发中的使用方式。
代替传统的常量
不用枚举的时候,我们一般都这么写常量:
public class Constants {
public static final int ENABLE = 1;
public static final int DISABLE = 0;
}用了枚举之后就简单多了:
public enum Status {
ENABLE, DISABLE;
}带属性的枚举——字典
如果要给每个枚举映射不同的含义和对应的值,那就相当于数据字典了,用枚举同样简单得多。只要你愿意,完全可以把枚举类写的全面好用。
public enum Status {
ENABLE(1, "启用"),
DISABLE(0, "禁用");
private final int value;
private final String name;
// 构造方法、getter方法 ......
public static Status getEnum(int value) {
for (Status e : Status.values()) {
if (Objects.equals(e.getValue(), value)) {
return e;
}
}
return null;
}
}单例模式的特殊实现方式
不用枚举时,我们实现单例模式有两种方式,分别是懒汉单例模式和饿汉单例模式。以饿汉单例模式为例,我们通常会这么写:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}使用枚举就简单多了,而且可以最大程度保障只有一个对象。
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
}使用枚举实现策略模式
策略模式是很经典的行为型模式,使用枚举可以很容易地制作有限可列举的不同策略。
举一个简单的例子吧,计算一个商品的折扣,可能这个商品参与多种活动,每种活动的折扣算法不一样,那么我们可以制作一个折扣规则类:
public enum Discount {
// 8折
DISCOUNT8(money -> {
return money * 0.8;
}),
// 满200-50
FULL_DISCOUNT200_50(money -> {
if (money > 200) {
return money - 50;
}
return money;
});
private Function<Double, Double> function;
Discount(Function<Double, Double> function) {
this.function = function;
}
public Double apply(Double value) {
return function.apply(value);
}
}这个示例中定义了两种优惠算法,实际计算时只需要传入枚举名称,即可得到具体的计算规则,应用这个计算规则也就可以得到优惠后的价格。