簡體   English   中英

Java 中“枚舉繼承”的解決方法實現?

[英]Workaround implementation for "enum inheritance" in Java?

前言:我已經研究過為什么“ enum inheritance ”在Java中是非法的。

我的問題如下:給定一個 class Recipe ,我希望它的屬性category是一個常量值列表,如APPETIZER, BREAKFAST, DESSERT, MAIN_COURSE, SOUP ——我邏輯上為此使用枚舉。

那么我的問題是:如果我希望每個枚舉都有“自己的孩子”(例如: BREAKFASTSWEETSAVORY ,或DESSERTCAKEMUFFINBISCUITS ),那么:

  1. 必須指定子類別(“子枚舉”)(例如myRecipe.setCategory myRecipe.setCategory(DESSERT)應該引發異常);
  2. 禁止使用來自不同“家庭”的“子枚舉”(例如SOUP.BISCUITS應該引發異常);
  3. 我應該能夠通過點符號(例如myRecipe.setCategory(DESSERT.CAKE) )或其他類似的“輕量級”語法訪問“子枚舉”。

我無法在 Java 中提出任何干凈的解決方案來滿足所有三個要求。

是否有任何“深奧”的設計模式? 你將如何實現這一點?

創建一個 class類別 在 Category 中,聲明所有枚舉類。

public class Category
{
    public enum APPETIZER
    {
    }

    public enum BREAKFAST
    {
        SWEET,
        SAVORY
    }

    public enum DESSERT
    {
        CAKE,
        MUFFIN,
        BISCUITS
    }

    public enum MAIN_COURSE
    {
    }
}

配方class 中,類別應為DESSERT類型。 我有 static 進口類別 class。

public class Recipe
{
    DESSERT category;

    public void setCategory(DESSERT category)
    {
        this.category = category;
    }

    public static void main(String[] args)
    {
        Recipe myRecipe = new Recipe();

        myRecipe.setCategory(DESSERT.BISCUITS);

        // statements below give compile time errors
        // myRecipe.setCategory(DESSERT);
        // myRecipe.setCategory(BREAKFAST.SWEET);
    }
}

這是一種自我實現,而不是設計模式。

你可以這樣做:

class Recipe {
    private final Meal meal;
    private final MealCategory category;

    public <T extends Meal> Recipe(T meal, MealCategory<T> category) {
        this.meal = meal;
        this.category = category;
    }
}
abstract class Meal {}
class Breakfast extends Meal {}
class Dinner extends Meal {}

class MealCategory<T extends Meal> {}

class Cereal extends MealCategory<Breakfast> {}
class Meat extends MealCategory<Dinner> {}

public class Test {

    public static void main(String[] args) {
        Recipe r = new Recipe(new Breakfast(), new Cereal());
        Recipe r2 = new Recipe(new Breakfast(), new Meat()); // compile time error
    }
}

暫無
暫無

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

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