在java中使用枚举类型

时间:2018-04-19 11:55:21

标签: java data-structures enums

我需要创建一个" super"枚举(此处ESideItem)将记录" sub"枚举(SALADFRYTACO)&我需要访问" sub" enum的字段(price)也来自外部 我的意思是"超级"作为主要类型& "子"作为该主要类型的子类型。
用餐和餐饮可以有多种类型的SideItems(FRY,SALAD,TACO)。这些副食品中的每一种都可以是多种类型(即SALAD可以是CHICKEN或AFGHAN或MIMOSA等)。
Ray Tayek this问题的回答后,我实施了以下内容:

public abstract class SideItem {

public enum FRY {
    FRENCHFRY(25.25f), SEASONEDCURLYFRY(30.10f);

    private float  price;

    FRY(float price) {
        this.price = price;
    }

    public float getPrice() {
        return price;
    }
}

public enum SALAD{
    AFGHANSALAD(50.25f), CHICKENSALAD(40.10f), MIMOSASALAD(45.89f);

    private float  price;

    SALAD(float price) {
        this.price = price;
    }


    public float getPrice() {
        return price;
    }
}

public enum TACO{
    MONSTERTACO(26.25f), NACHOMONSTERTACO(35.10f);

    private float  price;

    TACO(float price) {
        this.price = price;
    }


    public float getPrice() {
        return price;
    }
}

public enum ESideItem {
    FRY(SideItem.FRY.FRENCHFRY), SALAD(SideItem.SALAD.AFGHANSALAD), TACO(SideItem.TACO.MONSTERTACO);

    ESideItem(Enum e) {
        this.e = e;
    }

    public Object[] subValues() {
        return e.getDeclaringClass().getEnumConstants();
    }

    final Enum e;

}
}

我按如下方式实施Main.java

public class Main {

public static void main(String[] args) {

    for(SideItem.ESideItem aSideItem : SideItem.ESideItem.values()){
        System.out.println(aSideItem);
        for(Object o : aSideItem.subValues()){
            System.out.format("%-15s",o);
            System.out.println();
        }

        System.out.println();
    }
}
}

输出结果为:

FRY
FRENCHFRY      
SEASONEDCURLYFRY

SALAD
AFGHANSALAD    
CHICKENSALAD   
MIMOSASALAD    

TACO
MONSTERTACO    
NACHOMONSTERTACO

Main.java就像客户端& SideItem.java就像服务器端一样。我可以在ESubItem的{​​{1}}枚举中更改或添加任何实例。 SideItem.java应根据更改提供输出 但我确实需要获得这些个人TACO,SALAD,FRY的价格。
有没有办法使用枚举从Main.java访问这些字段?
如果没有,那么我应该用什么样的数据结构来解决这个问题?

4 个答案:

答案 0 :(得分:2)

您应该使用界面:

interface Food
{
    float getPrice();
}

public enum Fry implements Food 
{
    FRENCH_FRY(25.25f), SEASONED_CURLY_FRY(30.10f);

    private final float price;

    FRY(float price) {
        this.price = price;
    }

    @Override
    public float getPrice() {
        return price;
    }
}

其他两个人也一样......

然后你可以像这样编写它们:

public enum Meal implements Food {
    HAPPY_MEAL(Fry.FRENCH_FRY, Fry.SEASONED_CURLY_FRY),
    SAD_MEAL(Salad.AFGHAN_SALAD);

    private final List<Food> items;

    Meal (Food... items) {
        this.items = Arrays.asList(food);
    }

    @Override
    public float getPrice()
    {
        return (float) items.stream().mapToDouble(Food::getPrice).sum();
    }
}

答案 1 :(得分:0)

如果您想访问计算等的价格,最简单的方法是让所有这些枚举实现与public float getPrice()的接口。

出于显示目的,您只需要修改每个枚举的toString()

enum ESideItemSideItem类似乎没必要。特别是ESideItem似乎根本不应该是enum,而您使用getDeclaringClass().getEnumConstants()的方式只是一个非常糟糕的主意。

答案 2 :(得分:0)

您将需要以下内容:

for(Object o : aSideItem.subValues()){
    if(o instanceof SideItem.FRY)
    ((SideItem.FRY)o).getPrice()

答案 3 :(得分:0)

您可以定义一个界面,比如说

public interface Priced {
    double getPrice();
}

枚举可以实现

public enum FRY implements Priced { // no further change needed, method already there

您可以使用Priced返回subValues()数组。

public Priced[] subValues() {
    return Stream.of(FRY.values(), SALAD.values(), TACO.values()).
           toArray(Priced[]::new);
}

我不完全确定后者是否以这种方式工作,但能够在enum中实现接口是主要观点。