在java中使用枚举类型

在java中使用枚举类型,java,data-structures,enums,Java,Data Structures,Enums,我需要创建一个“超级”枚举(这里是ESideItem),它将记录“子”枚举(sala,fy,TACO)&我还需要从外部访问“子”枚举的字段(price) 我的意思是“超级”作为主类型,“子”作为该主类型的子类型。 一顿饭可以有很多种类的配菜(油炸食品、沙拉、塔可),每种配菜都可以有很多种类(即沙拉可以是鸡肉、阿富汗或含羞草等)。 以下是Ray Tayek对问题的回答,我已经实现了这一点: 我实现了Main.java,如下所示: public class Main { public stati

我需要创建一个“超级”枚举(这里是
ESideItem
),它将记录“子”枚举(
sala
fy
TACO
)&我还需要从外部访问“子”枚举的字段(
price
) 我的意思是“超级”作为主类型,“子”作为该主类型的子类型。
一顿饭可以有很多种类的配菜(油炸食品、沙拉、塔可),每种配菜都可以有很多种类(即沙拉可以是鸡肉、阿富汗或含羞草等)。
以下是Ray Tayek对问题的回答,我已经实现了这一点:

我实现了
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
类似于服务器端。我可以从
SideItem.java
更改或添加
ESubItem
枚举中的任何实例
Main.java
应根据该更改给出输出
但我确实需要获得这些单独的玉米卷、沙拉、油炸食品的价格。
有没有办法使用enum从
Main.java
访问这些字段

如果不是,那么我应该使用什么样的数据结构来解决这个问题呢?

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

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


不过,
enum ESideItem
SideItem
类似乎没有必要。尤其是
ESideItem
看起来根本不应该是
enum
,以及您使用
getDeclaringClass().getEnumConstants()的方式
这是一个非常糟糕的主意。

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

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


不过,
enum ESideItem
SideItem
类似乎没有必要。尤其是
ESideItem
看起来根本不应该是
enum
,而您使用
getDeclaringClass().getEnumConstants()
的方式是一个非常糟糕的主意。

您需要:

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

您将需要执行以下操作:

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

您可以定义一个接口,比如

public interface Priced {
    double getPrice();
}
枚举可以实现这一点

public enum FRY implements Priced { // no further change needed, method already there
您还可以使用
子值()
返回一个
定价的
数组


我不完全确定后者是否是这样工作的,但能够在
enum
中实现接口是关键

public interface Priced {
    double getPrice();
}
枚举可以实现这一点

public enum FRY implements Priced { // no further change needed, method already there
您还可以使用
子值()
返回一个
定价的
数组


我不完全确定后者是否是这样工作的,但能够在
enum
中实现一个接口是关键。

您应该使用一个接口:

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();
    }
}
公共枚举食物{
快乐套餐(油炸、法式油炸、油炸、调味油炸),
悲伤餐(沙拉、阿富汗沙拉);
私人最终清单项目;
膳食(食物…物品){
this.items=Arrays.asList(食物);
}
@凌驾
公开发行价格()
{
return(float)items.stream().mapToDouble(Food::getPrice.sum();
}
}

您应该使用一个界面:

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();
    }
}
公共枚举食物{
快乐套餐(油炸、法式油炸、油炸、调味油炸),
悲伤餐(沙拉、阿富汗沙拉);
私人最终清单项目;
膳食(食物…物品){
this.items=Arrays.asList(食物);
}
@凌驾
公开发行价格()
{
return(float)items.stream().mapToDouble(Food::getPrice.sum();
}
}

不完全确定您要实现的目标。是否希望所有枚举实现一个提供
getPrice()
方法的公共接口?不完全确定要实现什么。是否希望所有枚举实现一个提供
getPrice()
方法的公共接口?