Answers:
我不知道您想做什么,但这就是我实际上翻译示例代码的方式。
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;
}
}
另外,您可以为创建一个getter方法text
。
你现在可以做 Strings.STRING_ONE.toString();
final
也是最好的。
new
那样构造private
。从本质上讲,禁止创建对象,final
在这种情况下实际上并不是必须的。
setText(String)
在枚举上放一个,这可能会释放地狱:) final
某种文件表明了它在编译器支持下是一个常数。如果要使用String
常量,则不会将其声明为public static String
,对吗?
枚举的自定义字符串值
来自http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
java枚举的默认字符串值是它的面值或元素名称。但是,您可以通过覆盖toString()方法来自定义字符串值。例如,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
运行以下测试代码将产生此结果:
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
bin
目录中看到以下内容:EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class这将使实际操作快速完成。最好通过将值传递给枚举构造函数来将其作为期望的答案。我实际上不同意压倒一切toString()
;我认为最好使用显式的getter,例如,getKey()
因为toString()
枚举的另一个用户可能会意外覆盖。
使用其name()
方法:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
产量ONE
。
Strings.STRING_ONE.name()
生成的是“ STRING_ONE”,而不是“ ONE”。这根本不是一个好答案。你不能让这不会是一个有效的Java标识等任何字符串
name()
可能会受到混淆器程序的影响。不久前,我遇到了类似的问题。例如,使用Proguard,您需要解决此问题。请参阅处理枚举类
可以将枚举名称设置为与所需的字符串相同,或者更一般而言,可以将任意属性与枚举值相关联:
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.
}
重要的是,常量位于顶部,方法/属性位于底部。
根据“将它们用作字符串”的含义,您可能不想在此处使用枚举。在大多数情况下,The Elite Gentleman提出的解决方案将允许您通过它们的toString方法使用它们,例如in 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";
}
toLowerCase()
我的解决方案,则可以继续Strings.STRING_TWO.toString().toLowerCase()
。
interface
的final
类代替private
。不鼓励这样做。
您可以将其用于字符串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;
}
}
并从主方法调用
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
如果你不希望使用构造函数,你想有一个特殊的名字的方法,试试这个:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
我怀疑这是最快的解决方案。不需要使用变量final。
private String text
应该是最终的。