Câu trả lời:
Tôi không biết bạn muốn làm gì, nhưng đây là cách tôi thực sự dịch mã ví dụ của bạn ....
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;
}
}
Ngoài ra, bạn có thể tạo một phương thức getter cho text
.
Bây giờ bạn có thể làm Strings.STRING_ONE.toString();
final
sẽ là tốt nhất.
new
như là nhà xây dựng private
. Về cơ bản, việc tạo đối tượng bị cấm và final
không thực sự cần thiết trong trường hợp này.
setText(String)
enum và điều đó có thể giải phóng địa ngục :) final
loại tài liệu mà bạn nghĩ rằng đó là một hằng số với sự hỗ trợ của trình biên dịch. Nếu bạn sử dụng String
hằng số, bạn sẽ không khai báo nó public static String
, phải không?
Giá trị chuỗi tùy chỉnh cho Enum
từ http://javahowto.blogspot.com/2006/10/custom-opes-values-for-enum.html
Giá trị chuỗi mặc định cho java enum là mệnh giá của nó hoặc tên thành phần. Tuy nhiên, bạn có thể tùy chỉnh giá trị chuỗi bằng cách ghi đè phương thức toString (). Ví dụ,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Chạy mã kiểm tra sau sẽ tạo ra điều này:
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
thư mục: EnumTest $ MyType. Class EnumTest $ MyType $ 1. class EnumTest $ MyType $ 2. class sẽ tăng nhanh thực sự . Tốt nhất để làm điều đó như câu trả lời mong đợi, bằng cách chuyển các giá trị cho hàm tạo enum. Tôi thực sự không đồng ý với việc ghi đè toString()
; Tôi tin rằng tốt hơn là sử dụng một getter rõ ràng, chẳng hạn như việc ghi getKey()
đè toString()
có thể gây bất ngờ bởi một người dùng enum khác.
Sử dụng name()
phương pháp của nó :
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
sản lượng ONE
.
Strings.STRING_ONE.name()
mang lại "STRING_ONE", không phải "MỘT". Đây đơn giản không phải là một câu trả lời hay. Bạn không thể có bất kỳ Chuỗi nào không phải là định danh Java hợp lệ, v.v.
name()
có thể bị ảnh hưởng bởi một chương trình obfuscator. Tôi đã gặp một vấn đề tương tự một thời gian trước đây. Chẳng hạn, với Proguard, bạn cần giải quyết vấn đề này. Xem Xử lý các lớp học liệt kê
Hoặc đặt tên enum giống với chuỗi bạn muốn hoặc, nói chung, bạn có thể liên kết các thuộc tính tùy ý với các giá trị enum của bạn:
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.
}
Điều quan trọng là phải có các hằng số ở trên cùng và các phương thức / thuộc tính ở phía dưới.
Tùy thuộc vào ý của bạn bằng cách "sử dụng chúng làm Chuỗi", bạn có thể không muốn sử dụng enum ở đây. Trong hầu hết các trường hợp, giải pháp được đề xuất bởi The Elite Gent Quý ông sẽ cho phép bạn sử dụng chúng thông qua các phương thức toString của họ, ví dụ như trong System.out.println(STRING_ONE)
hoặc String s = "Hello "+STRING_TWO
, nhưng khi bạn thực sự cần Chuỗi (ví dụ STRING_ONE.toLowerCase()
), bạn có thể thích xác định chúng là hằng số:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
giải pháp của tôi, họ có thể đi Strings.STRING_TWO.toString().toLowerCase()
.
interface
thay cho một final
lớp với hàm private
tạo. Đó là một thực tế nản lòng.
Bạn có thể sử dụng nó cho chuỗi 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;
}
}
Và gọi từ phương thức chính
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Nếu bạn không muốn sử dụng các hàm tạo và bạn muốn có một tên đặc biệt cho phương thức này, hãy thử nó:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Tôi nghi ngờ rằng đây là giải pháp nhanh nhất . Không cần sử dụng biến cuối cùng .
private String text
nên là cuối cùng.