2010-03-17 38 views
6

Java'da sınıfları genel statik final alanına (arabirim veya soyut sınıf aracılığıyla) sahip olmak için zorlamanın bir yolu var mı? Ya da en azından bir kamusal alan mı?Java'da genel statik final alanına sahip olmak için sınıfları zorlamak için herhangi bir yol var mı?

Ben sınıfların bir grup onlarda

public static final String TYPE = "...";

sahip her nasılsa emin olmak gerekir.

+0

Ne yapmaya çalışıyorsunuz? Yansıma kullanan bir şey yapıyorsun, değil mi? Aksi takdirde problem yaşanmazdı (eğer alan "MyClass.field" ile başvurulursa fakat mevcut değilse, dolaylı olarak zorunlu kılınmış ya da alana bakmadığınız durumda derlenmeyecektir) – ewernli

+0

Bir fabrikayı veya benzerini düşünmek isteyebilirsiniz. –

+0

@Tom Neden bir haritalama ile uğraşmak Class -> TYPE? Sadece sınıfın tam adını kullanın. Birisi onlara bağlıdır ve bir gün alanını değiştirirseniz – ewernli

cevap

7

Hayır, yapamazsın.

Yalnızca her alt sınıf için uygun bir değer döndürecektir bir statik olmayan gaz giderici yöntem var onları zorlayabilir: olmadan

public abstract String getType(); 

bir değere şeyin her alt sınıfı haritasına gerekiyorsa, , bir public static Map<Class<?>, String> types; bir yere oluşturabilir, bunu oluşturmaya gereken tüm sınıfları ve onların türleri ile statik olarak dolduran ve derleyici bu zorlamak ama oluşturarak içine olmazdı için hiçbir yolu yoktur TypesHolder.types.get(SomeClass.class)

1

arayarak türünü elde özel bir FindBugs veyaBunu kontrol edebilecekkuralı.

1

Mümkün olduğunu sanmıyorum. Ama Böyle bir arabirim tanımlayabilirsiniz bir gettype yöntemiyle

5

ile bir arabirim yapabiliriz:

interface X { 
    public static final String TYPE = "..."; 
} 

ve sınıfları daha sonra bildirilen aynı değeri ile bu alanı olacağını arabirimini uygulamak yapabilirsiniz arayüz. Bu uygulamaya Constant interface anti-pattern denir.

Eğer sınıfları o zaman böyle arayüzde bir işlev tanımlayabilirsiniz farklı değerlere sahip olmak istiyorsanız:

interface X { 
    public String getType(); 
} 

ve sınıfları uygulama gerektiği gibi farklı değerler döndürebilir işlevi uygulamak zorunda kalacaktır.

Not: Bu aynı zamanda soyut sınıflar ile benzer şekilde çalışır.

+0

+1: Başka bir cevabı reddetmek üzereydim, çünkü OP'nin sadece tanımlayıcıya sahip olmak istediğini farketmedim, değer aynı değil. – Pops

0

Sınıflarınızda bir arabirim uygulayın ve others'un önerdiği gibi bu arabirimden bir yöntem çağırın.

Eğer kesinlikle bir statik alanınız varsa, sınıflardan geçecek bir birim testi yapabilir ve Reflection API aracılığıyla her sınıfın bu statik statik final alanına sahip olduğunu kontrol eder. Durum böyle değilse başarısız olun.

0

Ya da en azından bir genel alan? gitmek için her zamanki gibi IMO var

: - ve yok

public abstract class MyAbstract { 

    private final String type; 

    protected MyAbstract(String type) { 
    this.type = type; 
    } 

    public String getType() { 
    return type; 
    } 
} 

Bu şekilde, tüm uygulamalar bu süper yapıcı aramalıdır: üst sınıf olarak, yapıcı bir değer gerektirdiğini her birini getType() uygulamak.

+0

Ancak getType() öğesini statik olarak çağıramazsınız. –

+0

Hayır, yapamazsınız. Fakat bu, sorusunun ikinci kısmıydı: “... kamusal statik final alanına sahip olmak ... Ya da en azından sadece bir kamusal alan mı?” Bu yüzden şu soruyu anlıyorum: Statik olarak yapmak isterdim, ama bu mümkün değilse, en azından statik olarak. –

İlgili konular