假设我们有两个或多个枚举和一个包含所有枚举元素的Set,如:
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
public class Foo {
interface FooEnum {}
enum FooEnum1 implements FooEnum {
K1,
K2
}
enum FooEnum2 implements FooEnum {
K3,
K4
}
static public Set<FooEnum> all = new HashSet<FooEnum>();
public static void main(String [] args) {
Foo it = new Foo();
it.all.add( FooEnum1.K1 );
it.all.add( FooEnum1.K2 );
it.all.add( FooEnum2.K3 );
it.all.add( FooEnum2.K4 );
for( FooEnum k : it.all ) {
System.out.println( k.toString() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
all对于每个集合成员,每个枚举(在枚举本身之外)没有一个"添加" 就可以填充集合吗?也就是说,在枚举构造函数或静态代码中填充它?
**附录**
换句话说,目标是添加一个枚举元素或添加一个实现FooEnum的新枚举不需要新的代码行来填充集合(程序员可能会忘记导致错误).
更好的是,如果在构造函数或静态代码中完成"add"的初始化.
**附录2**
以下代码与预期类似,但不会产生预期结果:
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
public class Foo {
interface FooEnum {
}
static public Set<FooEnum> all = new HashSet<FooEnum>();
enum FooEnum1 implements FooEnum {
K1,
K2;
FooEnum1() {
all.add(this);
}
}
enum FooEnum2 implements FooEnum {
K3,
K4;
FooEnum2() {
all.add(this);
}
}
public static void main(String [] args) {
Foo it = new Foo();
for( FooEnum k : it.all ) {
System.out.println( k.toString() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下一个也失败了:
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
public class Foo {
interface FooEnum {
}
enum FooEnum1 implements FooEnum {
K1,
K2;
static {
for( FooEnum1 e : FooEnum1.values() ) {
all.add(e);
}
}
}
enum FooEnum2 implements FooEnum {
K3,
K4;
static {
for( FooEnum2 e : FooEnum2.values() ) {
all.add(e);
}
}
}
static public Set<FooEnum> all = new HashSet<FooEnum>();
public static void main(String [] args) {
Foo it = new Foo();
for( FooEnum k : Foo.all ) {
System.out.println( k.toString() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可能想用Set#addAll(Collection).它会自动将所有枚举值添加到HashSet
it.all.addAll(Arrays.asList(FooEnum1.values()));
it.all.addAll(Arrays.asList(FooEnum2.values()));
Run Code Online (Sandbox Code Playgroud)
如果你使用的是java-8,这里有一个oneliner.
it.all.addAll(Stream.of(FooEnum1.values(), FooEnum2.values())
.flatMap(x -> Arrays.stream(x)).collect(Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)
你可能无法获得可读性,但它是一个oneliner.
使用EnumSet#allOf似乎是一种相对简单的方法来解决这个问题:
it.all.addAll(EnumSet.allOf(FooEnum1.class));
it.all.addAll(EnumSet.allOf(FooEnum2.class));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |