2012-03-07 19 views

回答

3

如果您在可能的值的列表中通过,那么你可以不用这么多,因为这取决于类型是一个enum

public static <T> T findByString(T[] values, String toString) { 
    Objects.requireNonNull(toString); 
    for (T t : values) { 
     if (toString.equals(t.toString())) { 
      return t; 
     } 
    } 
    throw new IllegalArgumentException(); 
} 

调用具有:

Blah blah = SomeClass.findByString(Blah.values(), str); 
每次

不需要调用Blah.values(),你可以用把它放在一个对象,它可以通过周围,并用于一般。也许其他方法稍后添加。

public interface ByString<T> { // Choose a better name. 
    T find(String toString); 
} 
[...] 
    private static final ByString<Blah> blahs = byString(Blah.values()); 
[...] 
    public static <T> ByString<T> byString(T[] values) { 
     final T[] valuesCopy = values.clone(); 
     return new ByString<T>() { 
      public T find(String toString) { 
       return SomeClass.findByString(valuesCopy, toString); 
      } 
     }; 
    } 
[...] 

调用具有:

Blah blah = blahs.find(str); 

事实上,你可能要以优化。做toString荷兰国际集团一次,并使用地图。

public static <T> ByString<T> byString(T[] values) { 
     final Map<String,T> byToStrings = new HashMap<>(
      (int)(values.length/0.75f)+1 // Doesn't HashMap construction suck. 
     ); 
     for (T value : values) { 
      byToStrings.put(values.toString(), value); 
     } 
     return new ByString<T>() { 
      public T find(String toString) { 
       T value = byToStrings.get(toString); 
       if (value == null) { 
        throw new IllegalArgumentException(); 
       } 
       return value; 
      } 
     }; 
    } 
3

我不相信你可以远离“添加字段和属性”,在每个枚举。你可以让你fromText方法委托给一个共同的方法不过,如果你创建了该属性的接口,并通过其中values()或(更好)的EnumSet。 (更好:编写一种方法来创建不区分大小写的Map,并在每次枚举中调用一次,将结果存储在一个静态变量中。)

+0

认为它可能更简单,只需拿走“命名”枚举!感谢你的回答。 – jabalsad 2012-03-07 08:54:55

1

如果您有许多共享相同功能的枚举,我也可以。

  • 使用一个枚举,因为它们有很多共同点。
  • 使用一个辅助方法,每个枚举可以调用。

的Java 8将使这个虚拟扩展简单。它可以让你定义接口的默认实现(这必须是一个辅助/静态方法)