[英]Workaround implementation for "enum inheritance" in Java?
前言:我已經研究過為什么“ enum inheritance ”在Java中是非法的。
我的問題如下:給定一個 class Recipe
,我希望它的屬性category
是一個常量值列表,如APPETIZER, BREAKFAST, DESSERT, MAIN_COURSE, SOUP
——我邏輯上為此使用枚舉。
那么我的問題是:如果我希望每個枚舉都有“自己的孩子”(例如: BREAKFAST
的SWEET
和SAVORY
,或DESSERT
的CAKE
、 MUFFIN
和BISCUITS
),那么:
myRecipe.setCategory(DESSERT)
應該引發異常);SOUP.BISCUITS
應該引發異常);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.