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();
}
}