天天看點

容器類常用方法(5)

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