创建字符串枚举的最佳方法是什么?

Dor*_*ori 350 java enums

使enum类型表示一组字符串的最佳方法是什么?

我试过这个:

enum Strings{
   STRING_ONE("ONE"), STRING_TWO("TWO")
}
Run Code Online (Sandbox Code Playgroud)

我怎么能用它们Strings呢?

Buh*_*ndi 592

我不知道你想做什么,但这就是我实际翻译你的示例代码的方式....

/**
 * 
 */
package test;

/**
 * @author The Elite Gentleman
 *
 */
public enum Strings {
    STRING_ONE("ONE"),
    STRING_TWO("TWO")
    ;

    private final String text;

    /**
     * @param text
     */
    Strings(final String text) {
        this.text = text;
    }

    /* (non-Javadoc)
     * @see java.lang.Enum#toString()
     */
    @Override
    public String toString() {
        return text;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以为其创建getter方法text.

你现在可以做 Strings.STRING_ONE.toString();

  • @The Elite Gentleman如果在运行期间枚举常量的值发生变化会很糟糕,所以即使不需要,"final"也是最好的. (26认同)
  • 不要忘记Enums不能用`new`构造,因为构造函数是`private`.从本质上讲,禁止创建对象,在这种情况下,"final"并不是必需的. (8认同)
  • @TomásNarros是的,你仍然可以在构造函数中分配它,只要你在声明它最终时不给它一个值. (7认同)
  • @BuhakeSindi:这是真的,但不小心可能会倾向于在枚举上放置一个`setText(String)`并且可以释放地狱:)`final`类文档你的意图是它是编译器支持的常量.如果您使用`String`常量,则不会将其声明为`public static String`,对吧? (6认同)
  • 我不知道它是否是编译器要求,但`private String text`应该是final. (3认同)
  • @comiventor是的。“枚举”构造函数默认为“私有”。 (2认同)

vai*_*war 101

枚举的自定义字符串值

来自http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html

java enum的默认字符串值是其面值或元素名称.但是,您可以通过重写toString()方法来自定义字符串值.例如,

public enum MyType {
  ONE {
      public String toString() {
          return "this is one";
      }
  },

  TWO {
      public String toString() {
          return "this is two";
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

运行以下测试代码将产生以下结果:

public class EnumTest {
  public static void main(String[] args) {
      System.out.println(MyType.ONE);
      System.out.println(MyType.TWO);
  }
}


this is one
this is two
Run Code Online (Sandbox Code Playgroud)

  • 这不是*有效的方法.这将为枚举中的每个值创建一个新的自定义类.在上面的例子中,你将在`bin`目录中看到以下内容:EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class,它将加上_real_ quick.通过将值传递给枚举构造函数,最好将其作为预期答案.我实际上不同意重写`toString()`; 我相信最好使用一个显式的getter,例如`getKey()`,因为重写`toString()`可能是枚举的另一个用户意外. (16认同)

Bar*_*ers 66

使用它的name()方法:

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Strings.ONE.name());
    }
}

enum Strings {
    ONE, TWO, THREE
}
Run Code Online (Sandbox Code Playgroud)

收益率ONE.

  • `name()`的结果可能会受到混淆器程序的影响.我刚才遇到了类似的问题.例如,有了Proguard,你需要解决这个问题.请参阅[处理枚举类](http://proguard.sourceforge.net/manual/examples.html#enumerations) (17认同)
  • 是的,但``Strings.STRING_ONE.name()`产生"STRING_ONE",而不是"ONE".这根本不是一个好的答案.您不能拥有任何不是有效Java标识符的String等. (16认同)
  • @Mark,是的,它无法处理任何角色.如果OP只想要一个字符,那么这个解决方案比The Elite Gentleman建议更直接.但实际上:如果字符范围超过了有效的Java标识符可以具有的范围,那么这是不行的.好点子. (2认同)

Adr*_*ith 16

将枚举名称设置为与所需的字符串相同,或者更一般地,您可以将任意属性与枚举值相关联:

enum Strings {
   STRING_ONE("ONE"), STRING_TWO("TWO");
   private final String stringValue;
   Strings(final String s) { stringValue = s; }
   public String toString() { return stringValue; }
   // further methods, attributes, etc.
}
Run Code Online (Sandbox Code Playgroud)

将常量放在顶部,将方法/属性放在底部是很重要的.

  • 枚举构造函数默认是私有的,不需要访问修饰符。但这通常是关于访问修饰符的一个好点,我已经更新了我的代码以将它们添加到属性和访问器中。 (2认同)

hd4*_*d42 14

根据你的意思"将它们用作字符串",你可能不想在这里使用枚举.在大多数情况下,The Elite Gentleman提出的解决方案将允许您通过其toString方法使用它们,例如在System.out.println(STRING_ONE)或中String s = "Hello "+STRING_TWO,但是当您真正需要Strings(例如STRING_ONE.toLowerCase())时,您可能更喜欢将它们定义为常量:

public interface Strings{
  public static final String STRING_ONE = "ONE";
  public static final String STRING_TWO = "TWO";      
}
Run Code Online (Sandbox Code Playgroud)

  • 你不应该使用`interface`来代替带有`private`构造函数的`final`类.这是一种沮丧的做法. (6认同)
  • 实际上这就是我想要避免的......! (5认同)

Ada*_*11p 8

如果你希望使用构造函数,你想有一个特殊的名字的方法,试试这个:

public enum MyType {
  ONE {
      public String getDescription() {
          return "this is one";
      }
  },    
  TWO {
      public String getDescription() {
          return "this is two";
      }
  };

  public abstract String getDescription();
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这是最快的解决方案。不需要使用变量 final


Sho*_*ana 6

您可以将其用于字符串Enum

public enum EnumTest {
    NAME_ONE("Name 1"),
    NAME_TWO("Name 2");

    private final String name;

    /**
     * @param name
     */
    private EnumTest(final String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

并从主要方法调用

public class Test {
    public static void main (String args[]){
        System.out.println(EnumTest.NAME_ONE.getName());
        System.out.println(EnumTest.NAME_TWO.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)