Enum 和 EnumSet, EnumMap及其特性
枚举类 (Enum)
- 枚举类的对象是有限且固定的
- 枚举类的构造器一定是private(即无法从外部调用构造器,只在构造枚举值时调用)
> *构造器一般用来初始化定义和重写成员方法*
- enum 实现了 Seriablizable和Comparable接口
- 非抽象枚举类无法派生子类,所有枚举值都是public static final 的(需要在枚举类的第一行给出)
常用方法:
- int CompareTo(E o) 返回两对象的顺序:如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回零;
- String name() 返回枚举值的本名(括号外的名字)不会因toSting的改变而改变;
- static E values() 返回一个包含所有枚举值的数组方便遍历
- String toString()
- int ordinal() 返回枚举值的索引值(从0开始)
- static valueOf(Class enumType, String name)
注意:name必须是枚举值的字面值,与toString方法无关
- boolean equals() 不重写是等于==
用法:
- 在switch中用枚举类型
```java
public int getDeliveryTimeInDays() {
switch (status) {
case ORDERED: return 5;
case READY: return 2;
case DELIVERED: return 0;
}
}
```
- 枚举类强大的属性,方法和构造器
```java
public class Demo1 {
private stage s;
public enum stage{
good(0){
@Override
public boolean getBoolean() {
// TODO Auto-generated method stub
return true;
}
},
bad(1) {
@Override
public boolean getBoolean() {
// TODO Auto-generated method stub
return false;
}
};
stage(int a){
num=a;
}
private int num;
public abstract boolean getBoolean();
public int getNum() {
return num;
}
}
public Demo1(String s) {
this.s=stage.valueOf(s);
}
// Methods that set and get the status variable.
public static void main(String[] args) {
System.out.println(new Demo1("good").getStage().getNum());
}
}
```
EnumSet
EnumSet 是一种专门为枚举类型所设计的 Set 类型。
与HashSet相比,由于使用了内部位向量表示,因此它是特定 Enum 常量集的非常有效且紧凑的表示形式。
它提供了类型安全的替代方法,以替代传统的基于int的“位标志”,使我们能够编写更易读和易于维护的简洁代码。
EnumSet 是抽象类,其有两个实现:RegularEnumSet 、JumboEnumSet,选择哪一个取决于实例化时枚举中常量的数量。
在很多场景中的枚举常量集合操作(如:取子集、增加、删除、containsAll和removeAll批操作)使用EnumSet非常合适;如果需要迭代所有可能的常量则使用Enum.values()。
-
EnumSet allOf(Class elementType): 创建一个包含指定枚举类里所有枚举值的EnumSet集合。
-
EnumSet complementOf(EnumSet e): 创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet集合,新EnumSet集合包含原EnumSet集合所不包含的、此类枚举类剩下的枚举值。
(即新EnumSet集合和原EnumSet集合的集合元素加起来是该枚举类的所有枚举值)。
- EnumSet copyOf(Collection c): 使用一个普通集合来创建EnumSet集合。
- EnumSet copyOf(EnumSet e): 创建一个指定EnumSet具有相同元素类型、相同集合元素的EnumSet集合。
- EnumSet noneOf(Class elementType): 创建一个元素类型为指定枚举类型的空EnumSet。
- EnumSet of(E first,E…rest): 创建一个包含一个或多个枚举值的EnumSet集合,传入的多个枚举值必须属于同一个枚举类。
- EnumSet range(E from,E to): 创建一个包含从from枚举值到to枚举值范围内所有枚举值的EnumSet集合。
public class Demo1 {
private status s;
private static EnumSet<status> badOnes=EnumSet.of(status.bad);
public enum status{
... ...
}
public Demo1(String s) {
this.s=status.valueOf(s);
}
public static List<Demo1> getAllBadOnes(List<Demo1> input) {
return input.stream().filter(
(s) -> badOnes.contains(s.getStatus()))
.collect(Collectors.toList());
}
// Methods that set and get the status variable.
public static void main(String[] args) {
System.out.println(new Demo1("good").getStatus().getNum());
}
}
上述的代码可以将不同的Demo1的LIst中的bad Demo清除并返回全是good的Demo1 list
EnumMap
EnumMap是一个专门化的映射实现,用于将枚举常量用作键。与对应的 HashMap 相比,它是一个高效紧凑的实现,并且在内部表示为一个数组:
public static EnumMap<status,List<Demo1>> getAllkindsOfDemo1(List<Demo1> ls){
EnumMap <status,List<Demo1>>de=new EnumMap<status,List<Demo1>>(status.class);
for(Demo1 s: ls) {
status sta=s.getStatus();
if(de.containsKey(sta)) {
de.get(sta).add(s);
}else {
List<Demo1> n=new ArrayList<>();
n.add(s);
de.put(sta, n);
}
}
return de;
}
```
* 上面的方法将输入的demo list 按照status分类并通过EnumMap 输出;很强大