2013-06-06 19 views
8

Kitaplığımda bir "kullanıcı düzeyi" kavramı var. Birkaç varsayılan seviye sağladım, ancak çeşitli nedenlerle kullanıcıya kendi seviyelerini kullanma seçeneği vermek istiyorum.Ek açıklamalarda "Uzatılabilir enumatları" desteklemenin en iyi yolu?

Şu anda bu

public interface AdminLevel { 
    public void name(); 
} 

public enum StandardAdminLevels implements AdminLevel { 
    ADMIN, 
    ANONYMOUS 
} 

sorun kullanıcı genellikle bir ek açıklamayla onların gerekli kullanıcı seviyesini geçen gittiğini olmasıdır olarak uygulanmaktadır. Şeyler denedim ve başarısız olmuş: türü olarak AdminLevel Kullanılması

  • - türü olarak Dize kullanılması ancak StandardAdminLevels.ADMIN.name() ile değeri ayarlayarak "ek açıklama üye için geçersiz tip"
  • başarısız - olmalı "özellik değeri Başarısız sabit - ek açıklama üye için geçersiz tip '"
  • StandardAdminLevels seviyeleri (aslında bir enum) her biri için kamu statik nihai alan en bir şey uygulamayan bir nihai sınıf yapma ile başarısız'

var mı uygulanıyor başka türlü yapabilirim ' ek açıklamalarda uzatılabilir enumlar bulundurmayı düşünün mü? Netliklerinden ve geçersiz değerlere karşı temel korumalarından dolayı enumlarla uğraşmaya çalışıyorum ama düşünebildiğim tek diğer yöntem de String sabitleri. Sahip olduğum problem, her bir nokta kullanıcı seviyesinde, muhtemelen müşteri kodu

Herhangi bir fikirde doğrulama yapılmasını gerektirmesidir.

+0

Genişletilebilir bir enum, terimler açısından bir çelişkidir. Enumların tüm amacı tüm kümeyi tanımlamak ve sadece bunlara izin vermektir. – Aurand

+0

@Aurand Sihirli teller nasıl büyülüyor? Enumlar hala değerlerin doğrulanması için faydalıdır – TheLQ

+0

Tüm olası değerlere sahip bir numaraya sahip olmanın nesi yanlış? –

cevap

7

Tek fikir: Her olası AdminLevel kendi sınıfıdır. Bu sınıfın Class kodunu ek açıklamaya geçirin.

public final class Admin implements AdminLevel { ... } 
public final class Anonymous implements AdminLevel { ... } 

@Requires(Admin.class) public void protectedMethod() { ... } 

@interface Requires { 
    Class<? extends AdminLevel> value(); 
} 
+0

Woah, bu aslında kötü bir fikir değil. Sınıflar, Karşılaştırılabilir'i bile uygulayabilir ve bu nedenle kullanıcı tarafından sorgulanabilir – TheLQ

+0

İyi düşünce, ancak ben düz dizeler üzerinde avantaj görüyorum emin değilim. –

+0

@Paul Otomatik doğrulama ("sadfakjdsf" otomatik olarak bir yönetici seviyesi değildir) ve kullanıcı tarafından üretilebilirlik. Başka bir fikir olup olmadığına bakacağız, ama bu oldukça iyi bir – TheLQ

İlgili konular