2011-12-05 34 views
18

Im làm việc trên java, tôi đã tạo một enum như sau:Java enum yếu tố với không gian?

public enum myEnum 
{ 
    india, 
    russian, 
    england, 
    north America 
} 

Ví dụ ở trên cho các lỗi khi sử dụng không gian trong tên của nguyên tố (ví dụ: Bắc Mỹ). Bất kỳ đề xuất nào về cách giải quyết vấn đề trên?

+1

Quyền truy cập vào thành viên này cũng sẽ không thể thực hiện được; suy nghĩ về 'myEnum x = myEnum.north America'. Những điều này sẽ không thể chịu trách nhiệm bởi vì nếu một người sẽ cho phép những tên như vậy, nơi để đặt phần cuối của số nhận dạng? Có thể bao gồm dòng mã hoặc câu lệnh tiếp theo không? – Matten

+1

KHÔNG sử dụng chữ cái nhỏ cho enums và ngay cả đối với tên lớp! – banterCZ

Trả lời

52

Bạn không thể đặt khoảng trắng ở giữa số nhận dạng.

Làm như vậy kết thúc định danh và trình phân tích cú pháp giả định bất kỳ điều gì đến tiếp theo là mã thông báo hợp lệ trong ngữ cảnh của câu lệnh đó. Có rất ít (nếu có) địa điểm hợp pháp.

tên giá trị truyền thống Java sẽ là:

tính
INDIA,   // Or India, 
RUSSIA,  //  Russia, 
NORTH_AMERICA; //  NorthAmerica; 

Một enum có thể đã đi kèm, như tên con người có thể đọc được, ví dụ như,

public enum CountryAndOneContinent { 

    INDIA("India"), 
    RUSSIA("Russia"), 
    NORTH_AMERICA("North America"); 

    private String displayName; 

    CountryAndOneContinent(String displayName) { 
     this.displayName = displayName; 
    } 

    public String displayName() { return displayName; } 

    // Optionally and/or additionally, toString. 
    @Override public String toString() { return displayName; } 
} 

Tôi mâu thuẫn về việc sử dụng toString để cung cấp các biểu diễn lớp trình bày.

Tôi thích phương pháp truyền đạt mục đích của họ một cách rõ ràng – nó mang tính biểu cảm và rõ ràng hơn.

toString khá chung chung và chỉ cho phép một đại diện duy nhất. Nhiều định dạng đầu ra có thể được yêu cầu tùy thuộc vào ngữ cảnh, thông số, v.v. mà toString không cho phép.

Ưu điểm của toString bao gồm sử dụng các hoạt động chuỗi mặc định trên đối tượng và trong trường hợp này, sử dụng valueOf để dịch trực tiếp từ phiên bản có thể đọc được sang giá trị enum.

+2

Bạn có thể muốn một tên khác với tên ... (Chỉ một phần tử trong OP là một quốc gia thực sự, một quốc gia, một ngôn ngữ, một quốc gia thành viên và một lục địa. Một điều tra hoàn toàn.) –

+2

+1 để đề cập đến vấn đề với 'toString()'. Bạn có thể ofcourse thêm một phương thức 'getDisplayName()' thay vì sử dụng 'toString()'. – Jesper

+0

@ Jesper Vâng, tôi cho rằng đối với những thứ trông đặc biệt cho 'getXxx' - tôi để nó không phải JavaBeany. –

3

Viết chúng lại với nhau như northAmerica hoặc sử dụng dấu gạch dưới north_America.

+0

Cảm ơn Tudor, nhưng tôi không muốn làm như trên như bạn đã nói. cần phải giữ những từ đó tách biệt nhau. – BSalunke

+3

@BSalunke Bạn không thể. Tuy nhiên, bạn có thể tạo một 'enum' với một giá trị. Xem cập nhật. –

+2

Chỉ cần nhấn mạnh những gì Dave Newton đang nói: Bạn không thể, nó không hoạt động theo cách đó. – Tudor

1
public enum myEnum 
{ 
    india, 
    russian, 
    england, 
    north_america 
} 

Để giá trị truy cập

myEnum.values() 
+0

KHÔNG sử dụng chữ cái nhỏ cho enums và ngay cả đối với tên lớp! – banterCZ

+0

@banterCZ sic erat scriptum –

2

Các Java naming rule không cho phép không gian trắng như nhân vật có thể trong một tên biến, các lớp học, sự đếm và các thành viên enum (và tất cả các số nhận dạng khác). Do đó, "vấn đề" này không thể được giải quyết. Chỉ cần sử dụng `north_america 'làm tên thành viên!

An identifier is an unlimited-length sequence of Java letters and Java digits, the first of which must be a Java letter.

The Java letters include uppercase and lowercase ASCII Latin letters A-Z (\u0041-\u005a), and a-z (\u0061-\u007a), and, for historical reasons, the ASCII underscore (_, or \u005f) and dollar sign ($, or \u0024). The $ character should be used only in mechanically generated source code or, rarely, to access preexisting names on legacy systems.

The "Java digits" include the ASCII digits 0-9 (\u0030-\u0039).

+0

Đó là lỗi cú pháp, bạn có thể viết mã có thể biên dịch mà không theo quy ước. –

+0

Tôi không phải là một người nói tiếng Anh bản địa, nhưng đối với sự hiểu biết của tôi, nó nên được gọi là quy ước :-) – Matten

+0

'công khai enum myEnum' ở đây ông không theo quy ước. Nhưng 'bắc Mỹ' là lỗi cú pháp và nó sẽ không biên dịch. –

4

Sự cố không có gì (cụ thể) liên quan đến enums: trong Java, tên không thể có dấu cách. Hãy thử loại bỏ không gian (sử dụng viết hoa để cho biết các bit ngoài) hoặc sử dụng dấu gạch dưới để thay thế.

14

Tôi cồng kềnh để tiếp tục và đoán tại sao bạn muốn có một không gian trong tên; bởi vì bạn muốn tham chiếu nó như một chuỗi.

Vì vậy, làm như sau:

public enum MyEnum { 
    INDIA("India"), 
    RUSSIAN("Russian"), 
    ENGLAND("England"), 
    NORTH_AMERICA("North America");  

    private String name; 

    MyEnum(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    }  
} 

Bạn có thể xem xét chuỗi trọng.

public toString() { 
    return name; 
} 

Lợi thế của việc ghi đè lênString() là chuỗi này cũng có thể được sử dụng trong MyEnum .valueOf (myString). Vì vậy, trọng toString về cơ bản tạo ra một HashMap của các giá trị enum.

+2

Trừ khi tôi đang mssing một cái gì đó, ví dụ này không hoạt động trong Java 8; 'MyEnum.valueOf (" Bắc Mỹ ")' và 'MyEnum.valueOf (MyEnum.NORTH_AMERICA.toString())' đều ném cùng một lỗi: 'IllegalArgumentException Không có hằng số enum ofi.devops.cmwf.model.trigger.MyEnum.North America' – raffian

1

chỉ cần tạo giá trị của riêng bạnMở như hàm trong lớp enum của bạn. Thay thế dấu cách bằng dấu gạch dưới. tên hằng số enum của bạn như thế này "north_america (" Bắc Mỹ ")". Nếu phương thức không tìm thấy enum của bạn, nó chỉ trả về tham số.

public static String valueOfOrDefault(String myValue) { 
//replace space with underscore so it matches enum name 
     String value=myValue.toUpperCase().replaceAll("\\s", "_"); 
     for(myEnum type : myEnum.class.getEnumConstants()) { 
      if(type.name().equalsIgnoreCase(value)) { 
      return type.toString(); 
      } 
     } 
     return myValue; 
     } 
0

Tôi cũng đã giới thiệu phương pháp valueOf riêng. Nhưng tôi quay trở lại với Loại Enum và tôi không phải chuyển đổi "checkString"

checkString là "Tiền mặt nhỏ" chẳng hạn.

JournalType journalType = JournalType.valueOfOrDefault (checkString);

public enum JournalType { 

MISC_BILLING("Misc Billing"), 
MISC_BILLING_AUTONUM("Misc Billing AutoNum"), 
PRETTY_CASH("Petty Cash"), 
RECURRING_AP("Recurring AP"), 
GL_JOURNAL("GL Journal"), 
GDS_NDS("GDS/NDS"); 

private final String journalType; 

JournalType(String journalType) { 
    this.journalType = journalType; 
} 

@Override 
public String toString() { 
    return journalType; 
} 

public static JournalType valueOfOrDefault(String myValue) { 
    for(JournalType type : JournalType.class.getEnumConstants()) { 
     if(type.toString().equals(myValue)) { 
      return type; 
     } 
    } 
    throw new IllegalArgumentException("JournalType not found"); 
} 

} 
Các vấn đề liên quan