两个或多个枚举中的所有元素集

pas*_*qui 1 java enums set

假设我们有两个或多个枚举和一个包含所有枚举元素的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)

Yas*_*jaj 6

你可能想用Set#addAll(Collection).它会自动将所有枚举值添加到HashSet

it.all.addAll(Arrays.asList(FooEnum1.values()));
it.all.addAll(Arrays.asList(FooEnum2.values()));
Run Code Online (Sandbox Code Playgroud)

如果你使用的是,这里有一个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.


Mur*_*nik 6

使用EnumSet#allOf似乎是一种相对简单的方法来解决这个问题:

it.all.addAll(EnumSet.allOf(FooEnum1.class));
it.all.addAll(EnumSet.allOf(FooEnum2.class));
Run Code Online (Sandbox Code Playgroud)