我需要创建一个" super"枚举(此处ESideItem
)将记录" sub"枚举(SALAD
,FRY
,TACO
)&我需要访问" 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
访问这些字段?
如果没有,那么我应该用什么样的数据结构来解决这个问题?
答案 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 ESideItem
和SideItem
类似乎没必要。特别是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
中实现接口是主要观点。