天天看点

容器类常用方法(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();
	}
}