Java'da Enum'u tekli olarak kullanmak için en iyi yaklaşım nedir?


85

SO sorusunda yazılanlara dayanarak Java'da En İyi Tekil Uygulama - yani bir tekli oluşturmak için bir enum kullanma hakkında - (kurucu atlandı) arasındaki farklar / artılar / eksiler nelerdir

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

ve sonra arıyor Elvis.INSTANCE.getAge()

ve

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

ve sonra arıyor Elvis.getAge()

Yanıtlar:


96

Verdiği herhangi bir nesnenin özelliklerini kullanacak bir şeye bağlandığınızı varsayalım - Elvis.INSTANCE'ı çok kolay geçebilirsiniz, ancak Elvis.class'ı geçemez ve özelliği bulmasını bekleyemezsiniz (kasıtlı olarak bulmak için kodlanmadıkça sınıfların statik özellikleri).

Temel olarak, bir örnek istediğinizde yalnızca tekli kalıbı kullanırsınız . Statik yöntemler sizin için uygunsa, o zaman sadece bunları kullanın ve numaralandırma ile uğraşmayın.


1
Neden sıralama ile uğraşmıyorsunuz? Java5 + 'da singelton yapmanın daha iyi bir yolu var mı?
jontro

4
@jontro (yeniden) cevabı okuyun; bir singletona sahip olmanız gerektiğinde numaralandırmaları kullanmanızı ancak statik yöntemlerle
idare

@MiserableVariable Bir yıldan uzun süre önce buna yorum yaptım. Hangi bağlamda bahsettiğimi gerçekten hatırlayamıyorum.
jontro

sorulan soruyu cevaplamıyor
Thufir

2
@Thufir: "Fark nedir" bölümünü yanıtlıyor - cevabın kabul edildiği göz önüne alındığında, OP'nin en çok ilgilendiği şey gibi görünüyor.
Jon Skeet

69

Tekliğinizin bir arayüz uygulaması gerekmesi büyük bir avantajdır. Örneğinizin ardından:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

İle:

public interface HasAge {
    public int getAge();
}

Statik ile yapılamaz ...


1
Statik ile yapılabilir ... public static final HasAge INSTANCE = new HasAge () {private int age; @Override public int getAge () {dönüş yaşı; }}; ... bu yüzden hala enum yöntemi hakkında neyin iyi veya daha iyi olduğunu merak ediyorum. Sanırım iki arayüz uygulamaya ihtiyacınız olsaydı?
Sean Adkinson

9

(Durum bilgili) Tek tonlar genellikle statik değişkenler kullanmıyormuş gibi davranmak için kullanılır. Eğer genel olarak statik değişkeni gerçekten kullanmazsanız, daha az insanı kandırırsınız.


8

En basit ve en net olan seçeneği seçerdim. Bu biraz özneldir, ancak neyin en net olduğunu bilmiyorsanız, en kısa seçeneği tercih edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.