जवाबों:
मुझे नहीं पता कि आप क्या करना चाहते हैं, लेकिन इस तरह से मैंने वास्तव में आपके उदाहरण कोड का अनुवाद किया है ...।
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)
और वह नरक में प्रवेश कर सकता है :) इस final
तरह के दस्तावेज़ आपके इरादे कि यह कंपाइलर समर्थन के साथ एक निरंतर है। यदि आप String
स्थिरांक का उपयोग करने के लिए थे, तो आप इसे public static String
सही घोषित नहीं करेंगे ?
Enum के लिए कस्टम स्ट्रिंग मान
से http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
जावा एनम के लिए डिफ़ॉल्ट स्ट्रिंग मान इसका अंकित मूल्य या तत्व नाम है। हालाँकि, आप स्ट्रिंग को ओवरराइडिंग () विधि द्वारा कस्टमाइज़ कर सकते हैं। उदाहरण के लिए,
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()
; मेरा मानना है कि एक स्पष्ट गटर का उपयोग करना बेहतर है 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" पैदावार, "एक" नहीं। यह बस एक अच्छा जवाब नहीं है। आपके पास कोई स्ट्रिंग नहीं है जो एक मान्य जावा पहचानकर्ता नहीं होगा, आदि
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.
}
शीर्ष पर स्थिरांक होना आवश्यक है, और नीचे स्थित विधियाँ / विशेषताएँ।
"स्ट्रिंग्स के रूप में उनका उपयोग करें" से आपका क्या मतलब है, इस पर निर्भर करते हुए, आप यहां एक एनम का उपयोग नहीं करना चाहते हैं। ज्यादातर मामलों में, द एलीट जेंटलमैन द्वारा प्रस्तावित समाधान आपको उनके स्टर्लिंग-तरीकों के माध्यम से उन्हें उपयोग करने की अनुमति देगा, जैसे कि 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();
}
मुझे संदेह है कि यह सबसे तेज समाधान है। चर अंतिम का उपयोग करने की कोई आवश्यकता नहीं है ।
private String text
अंतिम होना चाहिए।