【问题标题】:Working with enum types in java在 java 中使用枚举类型
【发布时间】:2018-04-19 11:55:20
【问题描述】:

我需要创建一个“超级”枚举(此处为 ESideItem),它将记录“子”枚举(SALADFRYTACO)并且我需要访问“子”枚举的字段(price)也来自外面。
我的意思是“超级”作为主要类型,“子”作为该主要类型的子类型。
一顿饭可以有多种类型的 SideItems(FRY、SALAD、TACO),并且这些 sideitems 中的每一个都可以有多种类型(即 SALAD 可以是 CHICKEN 或 AFGHAN 或 MIMOSA 等)。
根据 Ray Tayekthis 问题的回答,我已经实现了这个:

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 类似于服务器端。我可以从SideItem.java 更改或添加ESubItem 枚举中的任何实例。 Main.java 应该根据那个变化给出输出
但我确实需要获取这些单独的 TACO、SALAD、FRY 的价格。
有没有办法使用枚举从Main.java 访问这些字段?
如果不是,那么我应该使用什么样的数据结构来解决这个问题?

【问题讨论】:

  • 不完全确定您要达到的目标。您是否希望所有枚举都实现一个提供getPrice() 方法的通用接口?

标签: java data-structures enums


【解决方案1】:

你应该使用一个接口:

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();
    }
}

【讨论】:

    【解决方案2】:

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

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

    enum ESideItemSideItem 类似乎没有必要。尤其是ESideItem 看起来根本不应该是enum,而且你使用getDeclaringClass().getEnumConstants() 的方式实在是太糟糕了。

    【讨论】:

      【解决方案3】:

      你需要这样的东西:

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

      【讨论】:

        【解决方案4】:

        你可以定义一个接口,比如说

        public interface Priced {
            double getPrice();
        }
        

        枚举可以实现它

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-09
          • 1970-01-01
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-18
          相关资源
          最近更新 更多