簡體   English   中英

如何包裝Java枚舉並仍然迭代它?

[英]How can I wrap a Java enum and still iterate over it?

我怎么能有一個抽象枚舉,或某種基本枚舉?

在我的通用代碼中,我想要一個枚舉占位符MyRetems的概念,而不是將自己與具體的枚舉聯系起來。 然后在我的每個項目中,我都會有一個具體的實現。

例如共同代碼

public interface MyItems {
    // Marker interface
}

項目A.

public enum Items implements MyItems {
     RED_CAR, BLUE_CAR, GREEN_CAR;
}

項目B.

public enum Items implements MyItems {
    BROWN_TREE, GREEN_TREE;
}

這似乎有效,但在我的公共代碼中,我不能在我的接口枚舉上寫一個循環,因為它不是枚舉。 在我的常用代碼中,我想寫

for (MyItems item : MyItems.values())
    doSomething(item);

但我不能,因為我的界面只是一個標記界面,它沒有.values()。

任何建議都非常感謝。 我不知道我是否完全以錯誤的方式嘗試。

這樣做真的沒有意義 - 因為values()方法是靜態的 要調用它,您需要知道要調用它的類型。

你最接近的將是:

public interface MyItemsFactory<T extends MyItems>
{
    Iterable<T> values();
}

然后以某種通用的方式實現它,例如

public class EnumFactory<T extends Enum<T> & MyItems>
    implements MyItemsFactory<T>
{
    private final Class<T> clazz;

    public EnumFactory(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    public Iterable<T> values()
    {
        return EnumSet.allOf(clazz);
    }
}

但基本規則是多態和靜態方法不混合。 在你的電話中:

for(MyItems item : MyItems.values())
    doSomething(item);

你期望它迭代的MyItems哪個實現? 您可以擁有實現MyItems大量類型。

您可以考慮使用Type Safe Enum Pattern替換枚舉,這將允許您使用values()方法實現接口,該方法返回特定實現的所有值。

獲取類並使用Class.getEnumConstants()從中挖掘值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM