2014-09-10 48 views
-1

我有这些枚举:加入枚举在Java中

public interface MyEnum { 
} 

public enum Foo implements MyEnum{ 
    A("Foo_a"), 
    B("Foo_b"), 
    C("Foo_c") 

    private String name = ""; 
    Foo(String name) { 
     this.name = name; 
    } 
    @Override 
    public String toString() { 
     return name; 
    } 
} 

public enum Bar implements MyEnum { 
    A("Bar_a"), 
    B("Bar_b"), 
    C("Bar_c") 
    private String name = ""; 
    Bar(String name) { 
     this.name = name; 
    } 
    @Override 
    public String toString() { 
     return name; 
    } 
} 

我将不得不使用一种方法来加入我的枚举是这样的:

join(Foo, A, B) 

或以其他方式(更好):

Foo.join(A, B) 

返回:

"Foo_a, Foo_b" 

我尝试这样做:

static String join(MyEnum table, Object ... words) { 
    String joined = words[0].toString(); 
    for(int i = 1 ; i<words.length ; i++) { 
     for(MyEnum.class t : MyEnum.values()) { 
      if (t == words[i]) { 
       joined += ", " + words[i].toString(); 
      } 
     } 
    } 
    return joined; 
} 

但似乎我不能做for(MyEnum.class t : MyEnum.values())

你有什么想法来实现这种方法吗?

+1

接口'MyEnum'没有一个名为'方法值()'。 – forgivenson 2014-09-10 12:05:24

+0

而不是'MyEnum.values()',你可能的意思是'table.values()' – Joffrey 2014-09-10 12:20:41

+0

另外,你想在这里实现什么?你想加入来自不同枚举的元素吗? @Jesper的简单答案似乎就是您在这里所需要的。如果对你不够,请更具体。 – Joffrey 2014-09-10 12:22:04

回答

2

您在方法的任何地方都没有使用参数table,您不需要传递它。此外,为什么你想循环的枚举值MyEnum(这是行不通的,因为接口MyEnum没有values()方法)?您也可以循环访问words阵列。

这种简单的版本适用于任何类型的对象,包括你的枚举值:

static String join(Object... words) { 
    StringBuilder sb = new StringBuilder(); 

    if (words.length > 0) { 
     sb.append(words[0]); 
     for (int i = 1; i < words.length; i++) { 
      sb.append(", ").append(words[i].toString()); 
     } 
    } 

    return sb.toString(); 
} 
0

我真的只是猜测,但我想你想要做的是加入枚举成一个单一的字符串表示。所以从枚举

[Foo.A, Foo.B, Bar.B] 
要创建的字符串

"Foo_a, Foo_b, Bar_b" 

如果是这样的话

的名单,你需要有在接口常用的方法,这将提供相应的名称:

此外,您的枚举必须实现此方法并返回其名称

public enum Foo implements MyEnum{ 
    @Override 
    public String getName() { 
     return name; 
    } 
} 

然后你可以有你的加入方法:

static String join(MyEnum... words) { 
    if(words == null || words.length == 0){ 
     return ""; 
    } 
    StringBuilder joined = new StringBuilder(words[0].getName()); 
    for(int i = 1 ; i<words.length ; i++) {   
      joined.append(", ").append(words[i].getName()); 
    } 
    return joined.toString(); 
} 
+0

在他的情况下,接口方法是'toString()'。 – 2014-09-10 12:56:36

+0

非常感谢!但不会加入几种类型的枚举,即'[Foo.a,Foo.b]'或'[Bar.a,Bar.b]',但从不''[Foo.a,Bar.a]'。我只想知道是否可以在我的连接方法中指定枚举类型,以便不在每个参数中指定它。 – roipoussiere 2014-09-10 13:09:45

+0

当然,但是他根本不需要接口。它可能会/可能不会滥用toString(),这取决于名称应该是对象的字符串表示形式。 – 2014-09-10 13:14:42