EnumSet: 与枚举类型一起使用的专用 Set
实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好,足以用作传统上基于 int 的“位标志”的替换形式,具有高品质、类型安全的优势。
实现注意事项:所有基本操作都在固定时间内执行。虽然并不保证,但它们很可能比其 HashSet
副本更快。如果其参数也是一个枚举 set ,则批量操作会在固定时间内执行。
1. 基本方法
package cn.yjq.interview;
import java.util.EnumSet;
import org.junit.Test;
import static cn.yjq.interview.AlarmPoint.*;
public class EnumSets {
@Test
public void test1() {
EnumSet<AlarmPoint> points = EnumSet.noneOf(AlarmPoint.class);
points.add(BATHROOM);
System.out.println("1---: " + points);
points.addAll(EnumSet.of(STAIR1, STAIR2));
System.out.println("2---: " + points);
points = EnumSet.allOf(AlarmPoint.class);
System.out.println("3---: " + points);
points.removeAll(EnumSet.of(STAIR1, STAIR2));
System.out.println("4---: " + points);
points.removeAll(EnumSet.range(OFFICE1, OFFICE3));
System.out.println("5---: " + points);
points = EnumSet.complementOf(points);
System.out.println("6---: " + points);
}
}
2. 应用举例:洗车流程,可扩展Enum类,实现洗车服务的扩展
package cn.yjq.interview;
import java.util.EnumSet;
public class CarWash {
public enum Cycle {
//底部,轮子,预洗,基本,打蜡,漂洗,吹干
UNDERBODY {
@Override
public void action() {
System.out.println("洗车子底部");
}
}, WHEELWASH {
@Override
public void action() {
System.out.println("洗车轮子");
}
}, PREWASH {
@Override
public void action() {
System.out.println("预洗下");
}
}, BASIC {
@Override
public void action() {
System.out.println("基本套餐洗法");
}
}, HOTWAX {
@Override
public void action() {
System.out.println("车子打蜡");
}
}, RINSE {
@Override
public void action() {
System.out.println("车子漂洗");
}
}, BLOWDRY {
@Override
public void action() {
System.out.println("车子吹干");
}
};
abstract void action();
}
EnumSet<Cycle> cycles = EnumSet.of(Cycle.BASIC, Cycle.HOTWAX);
public void add(Cycle c) {
cycles.add(c);
}
public void washCar() {
for(Cycle c : cycles) {
c.action();
}
}
@Override
public String toString() {
return cycles.toString();
}
public static void main(String[] args) {
CarWash wash = new CarWash();
System.out.println(wash);
wash.washCar();
wash.add(Cycle.BLOWDRY);
wash.add(Cycle.UNDERBODY);
wash.add(Cycle.WHEELWASH);
wash.add(Cycle.RINSE);
System.out.println(wash);
wash.washCar();
}
}