Soru Java enum - neden isim yerine toString kullanıyorsunuz?


Enum api yöntemine bakarsanız name() diyor ki:

Tam olarak enum beyanında belirtildiği gibi, bu enum sabitinin adını döndürür.           Çoğu programcı, bu tercihine göre toString yöntemini kullanmalıdır.           toString yöntemi daha kullanıcı dostu bir ad verebilir.           Bu yöntem öncelikli olarak, doğruluğun serbest bırakmaya kadar değişmeyecek kesin isme ulaşmaya bağlı olduğu özel durumlarda kullanılmak üzere tasarlanmıştır.

Neden kullanmak daha iyidir toString()? İsim () zaten son olduğunda, toString geçersiz kılınabilir. Bu yüzden eğer toString'i kullanırsanız ve birisi sabit kodlanmış bir değer döndürmek için geçersiz kılarsa, tüm uygulama kapalıdır ... Ayrıca kaynaklara bakarsanız, toString () yöntemi tam olarak ve sadece ismi döndürür. Aynı şey.


145
2017-11-08 14:35


Menşei


Geçersiz kılınabilir toString() Enumda, ama hiç kimse onu uzatabilir ve geçersiz kılabilir. Enilleri genişletemezsin. - Erick G. Hagstrom


Cevaplar:


Gerçekten döndürülen değerle ne yapmak istediğinize bağlıdır:

  • Enum sabitini bildirmek için kullanılan adın aynısını almanız gerekiyorsa, kullanmalısınız. name() gibi toString geçersiz kılınmış olabilir
  • Enum sabitini kullanıcı dostu bir şekilde yazdırmak isterseniz, kullanmalısınız. toString Bu geçersiz kılınmış olabilir (ya da değil!).

Kafa karıştırıcı olabileceğini düşündüğümde, daha spesifik bir bilgi veriyorum. getXXX yöntem, örneğin:

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}

169
2017-11-08 14:37





kullanım name() Bir karşılaştırma yapmak istediğinizde veya kodunuzda bazı dahili kullanım için kodlanmış değeri kullanın.

kullanım toString() Bir kullanıcıya bilgi sunmak istediğinizde (bir günlüğe bakarak bir geliştirici dahil). Asla kodunuza güvenmeyin toString() belirli bir değer vermek. Asla belirli bir dizgeye karşı test etmeyin. Birisi doğru bir şekilde değiştirdiğinde kodunuz kırılırsa toString() dönüş, o zaman zaten kırılmıştı.

Javadoc'tan (vurgu benim):

Nesnenin dize gösterimini döndürür. Genel olarak   toString yöntemi bir dizge döndürür "metinsel olarak temsil eder" bu   nesne. Sonuç kısa ama bilgilendirici bir temsil olmalı   bu kolay okumak için bir kişi. Hepsinin tavsiye edilmesi   alt sınıflar bu yöntemi geçersiz kılar.


45
2017-11-08 14:37





name() "yerleşik" bir yöntemdir enum. Bu son ve onun uygulanmasını değiştiremezsin. Enum sabitini yazıldığı gibi döndürür, örn. büyük harf, boşluk vb.

Karşılaştırmak MOBILE_PHONE_NUMBER ve Mobile phone number. Hangi sürüm daha okunabilir? İkincisine inanıyorum. Bu fark: name() her zaman döner MOBILE_PHONE_NUMBER, toString() geri dönmek için geçersiz olabilir Mobile phone number.


21
2017-11-08 14:41



Bu doğru değil!! toString () döndürür Mobile phone number sadece bu değeri döndürmek için geçersiz kılarsanız. Aksi takdirde geri dönecek MOBILE_PHONE_NUMBER - spauny
@spayny, geçersiz kılmanız gerektiği açıktır toString(). Yakalama bu name() final olduğundan beri geçersiz kılınamaz. - AlexR
@AlexR% 100 doğru yapmak için yukarıdaki yorumunuzu cevaba eklemeniz gerekebilir. - artfullyContrived
Yorumlarınızı okuyana kadar bana açık olmadığı için @artfullyContrived ile aynı fikirdeyim. - martinatime


Çoğu kişi körü körüne javadoc'un tavsiyelerini takip ederken, aslında toString () 'den kaçınmak istediğiniz çok özel durumlar vardır. Örneğin, Java kodumdaki enumları kullanıyorum, ancak bir veritabanına serileştirilmeleri ve tekrar geri dönmeleri gerekiyor. Eğer String () 'i kullansaydım, teknik olarak diğerlerinin belirttiği gibi geçersiz kılınmış davranışlara maruz kalırdım.

Ek olarak, veritabanından da serileştirilebilir, örneğin, bu her zaman Java'da çalışmalıdır:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());

Oysa bu garanti edilmez:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());

Bu arada, Javadoc'un açıkça "çoğu programcının" olması gerektiğini çok tuhaf buluyorum. Bir enumun toString'inde çok az kullanım-durum buluyorum, eğer insanlar bunu “dostça bir isim” için kullanıyorlarsa, bu, çoğu durumda, name () yöntemini kullanın.


11
2018-03-17 03:06



Cevabın için teşekkür ederim. Bu soruyu sorduğumdan neredeyse 5 yıl geçti ve henüz bir enum için toString () yöntemini kullanıyorum! Kullandığım zamanların% 99'u tam olarak sizin anlattığınız şey için enumatlar: enum isimlerini serileştirme ve seri hale getirme. - spauny


name () kelimenin tam anlamıyla enum'un java kodundaki metin adıdır. Bu, java kodunuzda gerçekten görünebilen dizelerle sınırlı olduğu anlamına gelir, ancak istenen tüm dizeler kod içinde ifade edilemez. Örneğin, bir sayı ile başlayan bir dizeye ihtiyacınız olabilir. name () bu dizeyi sizin için asla elde edemeyecektir.


4
2017-08-07 21:05





Ad () ve toString () öğesinin farklı olması mantıklı olduğunda, tek değerli tanımlamanın tekil tanımlamak için kullanıldığı bir örnek. İlk bakışta şaşırtıcı görünüyor ama çok mantıklı geliyor:

enum SingletonComponent {
    INSTANCE(/*..configuration...*/);

    /* ...behavior... */

    @Override
    String toString() {
      return "SingletonComponent"; // better than default "INSTANCE"
    }
}

Böyle bir durumda:

SingletonComponent myComponent = SingletonComponent.INSTANCE;
assertThat(myComponent.name()).isEqualTo("INSTANCE"); // blah
assertThat(myComponent.toString()).isEqualTo("SingletonComponent"); // better

3
2018-03-11 22:44



Evet, haklısın ... iyi bir örnek Guava'nın enum Tahminleri - spauny