在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()
方法的公共接口?