2013-08-03 51 views
49

Sau khi đọc tài liệu của String java.lang.Enum.name() Tôi không chắc tôi hiểu khi nào nên sử dụng name() và khi nào sử dụng toString().Sự khác nhau giữa `Enum.name()` và `Enum.toString()` là gì?

Trả về tên của hằng số enum này, chính xác như được khai báo trong khai báo enum của nó. Hầu hết các lập trình viên nên sử dụng phương thức toString ưu tiên cho phương thức này, vì phương thức toString có thể trả về một tên thân thiện với người dùng hơn. Phương pháp này được thiết kế chủ yếu để sử dụng trong các tình huống chuyên biệt mà tính chính xác phụ thuộc vào việc lấy tên chính xác, mà sẽ không thay đổi từ bản phát hành sang bản phát hành.

Đặc biệt, mặc dù các tài liệu nói đến thích toString(), riêng StandardLocation liệt kê Java sử dụng name khi tôi đã có thể nghĩ tài liệu gợi ý khác.

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

Hơn nữa Enum cụ toString() như,

public String toString() { 
    return name; 
} 

và tôi không thể nghĩ ra một tình huống mà một người sử dụng định nghĩa liệt kê sẽ ghi đè lên toString() nên name()toString() là hầu như luôn luôn giống hệt nhau.

  1. Bạn có thể giải thích tại sao bỏ qua tài liệu và luôn sử dụng name() là một ý tưởng tồi?
  2. Điều gì về cụm từ "sẽ không thay đổi từ bản phát hành sang bản phát hành". Nếu tên sẽ không thay đổi, nó có ngụ ý rằng java.lang.Enum.toString() sẽ không?
+5

Theo mặc định, '.toString()' của một enum là '.name()' của nó. Tuy nhiên, bạn có thể ghi đè '.toString()', không phải '.name()'. – fge

Trả lời

110

Sự khác biệt chính giữa name()toString()name() là một final phương pháp, do đó, nó không thể được ghi đè. Phương thức toString() trả về cùng giá trị name() theo mặc định, nhưng toString() có thể bị ghi đè bởi các lớp con của Enum.

Do đó, nếu bạn cần tên của trường đó, hãy sử dụng name(). Nếu bạn cần một biểu thị chuỗi giá trị của trường, hãy sử dụng toString().

Ví dụ:

public enum WeekDay { 
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY; 

    public String toString() { 
     return name().charAt(0) + name().substring(1).toLowerCase(); 
    } 
} 

Trong ví dụ này, WeekDay.MONDAY.name() lợi nhuận "thứ hai", và WeekDay.MONDAY.toString() lợi nhuận "Monday".

WeekDay.valueOf(WeekDay.MONDAY.name()) trả về WeekDay.MONDAY, nhưng WeekDay.valueOf(WeekDay.MONDAY.toString()) ném một số IllegalArgumentException.

5

Sử dụng toString khi bạn cần hiển thị tên cho người dùng.

Sử dụng name khi bạn cần tên cho chính chương trình của bạn, ví dụ: để xác định và phân biệt giữa các enums khác nhau.

7

Sử dụng toString() khi bạn muốn trình bày thông tin cho người dùng (bao gồm cả người phát hiện xem nhật ký). Không bao giờ dựa vào mã của bạn trên toString() cho một giá trị cụ thể. Không bao giờ thử nghiệm nó với một chuỗi cụ thể. Nếu mã của bạn bị hỏng khi ai đó thay đổi chính xác tiền trả về toString() thì mã đó đã bị hỏng.

Nếu bạn cần phải nhận được tên chính xác dùng để khai báo hằng số enum, bạn nên sử dụng name() như toString có thể đã được overriden