2011-12-11 13 views
12

en Öyle gibi, kimin biçimi temel XML olan bir dosya var diyelim:Yaratma Numaralamalar Dinamik

<?xml version="1.0"?> 
<enum-set> 
    <enum> 
     <name>SomeEnum</name> 
     <values> 
      <value> 
       <name>SOMEVALUE</name> 
       <displayText>This is some value</displayText> 
      </value> 
      ... more values ... 
     </values> 
    </enum> 
    ... more enums ... 
</enum-set> 

ve ben zamanında böyle bir şey haline SomeEnum çevirmek istedi:

public enum SomeEnum implements HasDisplayText { 
    SOMEVALUE("This is some value"), 
    ... more values ...; 

    private String displayText; 

    SomeEnum(String displayText) { 
     this.displayText = displayText; 
    } 

    @Override 
    public String getDisplayText() { 
     return displayText; 
    } 
} 

.. ve sonra benim uygulama etrafında yeni oluşturulan enum SomeEnum iletin. Böyle bir şeye nasıl ulaşabilirim? Yapılabilir mi?

cevap

14

Yapmaya çalıştığınız şey pek bir anlam ifade etmiyor. Enums sadece sabit bir sabitler kümesini temsil ettikleri için, derleme süresinin yararı içindir. Çalışma zamanında, dinamik olarak oluşturulmuş bir enumun anlamı ne olurdu - bu basit bir nesneden nasıl farklı olurdu? Örneğin:

public class Salutation implements HasDisplayText { 

    private String displayText; 

    private Salutation(String displayText) { 
     this.displayText = displayText; 
    } 

    @Override 
    public String getDisplayText() { 
     return displayText; 
    } 

    public static Collection<Salutation> loadSalutations(String xml) { 
     //parse, instantiate, and return Salutations 
    } 
} 

XML'niz bazı Collection saklanan veya başka bir şekilde program tarafından kullanılabilecek yeni oluşturulmuş Salutation nesneler ayrıştırılır edilebilir. Örneğimde, bir private yapıcısını vererek Salutation oluşturulmasını kısıtladım; bu durumda örnekleri almanın tek yolu, XML'inizi alan fabrika yöntemini çağırmaktır. Bunun, aradığınız davranışa ulaştığına inanıyorum.

+0

mantıklı. Özellikle enumlar hakkında soru sordum, çünkü hiyerarşim şu anda çok fazla var (bir tuhaf miktar değil, sadece birkaçdan fazla) ve onları yok etmeyi umuyordum. –

+0

@Chris - Bekle, kod oluşturma hakkında sorularınız mı var, yoksa bunları çalışma zamanında mı oluşturuyorsunuz? –

+0

Gerçekten, çalışma zamanında bunları oluşturmakla ilgilidir. Sanırım bu farklı. –

6

Aslında dinamik enum örnekleri oluşturmak için mümkündür, ancak, ben hiç tavsiye etmem toplam beygir - belki bir enum doğasını yanlış anlıyorsun, bu bir derleme zamanı özelliktir dil ve çalışma zamanında örneklerini eklemeniz/kaldırmanız gerekmiyor. dinamik enum örnekleri oluşturmak için hack ilgileniyorsanız

Neyse, bu article bakabilirsiniz.

0

Oscar Lopez ile katılıyorum. Yaptığım şey, bir çeşit hack.

public static enum Setter { 

    DYNAMIC_ENUM_EXAMPLE { 

     @Override 
     public String setGetValue(String yourValue) { 
      return "prefix " + yourValue + " postfix"; 
     } 
    }; 
    public abstract String setGetValue(String value); 
} 

Böyle değeri elde edebilirsiniz:

Setter.DYNAMIC_ENUM_EXAMPLE.setGetValue("namaste") 

Çıktı:

public abstract class DEnum<E extends DEnum<E>> implements Comparable<E>, Serializable { 

Bu sınıf vardır:

prefix namaste postfix 
0

Dinamik Numaralamalar sorununuza cevap Enu standardına benzer bir imza m sınıfı. Beton Enum sınıflarında örnek oluşturulmasına izin veren korumalı bir kurucuya sahiptir.Örneğin:

YesNo[] items = yes.getItems(); 
assert (items.length == 2); 

O sağlar:

String name = YesNo.YES.getName(); 
YesNo yes = YesNo.get(YesNo.class, name); 
assert (yes == YesNo.YES); 

tüm öğeleri alır bir daktilo alıcı yok:

public class YesNo extends DEnum<YesNo> { 

    public final static YesNo YES = new YesNo(); 
    public final static YesNo NO = new YesNo(); 

DEnum sınıf iç gözlem yoluyla üyelerinin isimlerini bilen (veritabanı veya dosyadan) ile çalışma zamanında dinamik olarak üyeler ekleyin:

YesNo maybe = getOrCreateIfNotExists(YesNo.class, "MAYBE"); 
items = yes.getItems(); 
assert (items.length == 3); 
01 statik üye olarak aynı davranışa sahip

:

YesNo unknown = YesNo.get(YesNo.class, "MAYBE"); 
assert (unknown == maybe); 
+0

"DEnum" uygulamasına bir bağlantı eklemelisiniz veya buraya gönderin –