回答:
あなたが何をしたいのかわかりませんが、これが実際にサンプルコードを翻訳した方法です...
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;
}
}
または、のゲッターメソッドを作成できますtext
。
あなたは今できる Strings.STRING_ONE.toString();
final
が最善です。
new
コンストラクタがあるとしてprivate
。基本的に、オブジェクトの作成は禁止されておりfinal
、この場合は必要ありません。
setText(String)
列挙型にaを付ける傾向があり、それが地獄を解き放つ可能性がfinal
あります:) 一種のドキュメントは、コンパイラサポートのある定数であることを意図しています。String
定数を使用する場合public static String
、それをとして宣言しませんか?
列挙型のカスタム文字列値
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";
}
}
}
次のテストコードを実行すると、これが生成されます。
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まで追加されます:ディレクトリ本当迅速に。enumコンストラクターに値を渡すことにより、期待される答えとしてそれを行うのが最善です。私は実際にオーバーライドすることに同意しtoString()
ません。enumの別のユーザーが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()
"ONE"ではなく "STRING_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.
}
上部に定数、下部にメソッド/属性を配置することが重要です。
「文字列として使用する」の意味によっては、ここで列挙型を使用したくない場合があります。ほとんどの場合、エリート紳士によって提案された解決策は、あなたが例えば自分のtoStringメソッドを、介してそれらを使用できるようになりますSystem.out.println(STRING_ONE)
かString s = "Hello "+STRING_TWO
、しかし、あなたが本当に(例えば文字列を必要とするとき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
最終的なものでなければなりません。