在Java中,如何创建从不同枚举中选择的类属性?

在Java中,如何创建从不同枚举中选择的类属性?,java,enums,Java,Enums,编辑2:更多解释 这个概念是由“短语”和“属性”构成的句子,前者只是字符串,后者只能是特定的单词 示例:“系统”将“执行”操作 系统和操作(属性)只能是某些单词,所以我希望它们是枚举。但我也认为,一般来说,它们完成了相同的事情,所以我想我应该创建一个名为Attribute的类,它要么是一个系统,要么是一个动作 ======================================== 编辑:发布我的真实代码,而不是解释一个简单的例子 关键部分是结尾的未成文构造函数。我希望能够创建系统或操作

编辑2:更多解释

这个概念是由“短语”和“属性”构成的句子,前者只是字符串,后者只能是特定的单词

示例:“系统”将“执行”操作

系统和操作(属性)只能是某些单词,所以我希望它们是枚举。但我也认为,一般来说,它们完成了相同的事情,所以我想我应该创建一个名为Attribute的类,它要么是一个系统,要么是一个动作

========================================

编辑:发布我的真实代码,而不是解释一个简单的例子

关键部分是结尾的未成文构造函数。我希望能够创建系统或操作类型的属性

public class Attribute {
    // Subsystem Enum
    public enum subsystem {
        PROCESSOR ("Processor"), 
        MONITOR ("Monitor"), 
        MOUSE ("Mouse"), 
        KEYBOARD ("Keyboard");

        private String value;

        private subsystem(String value){
            this.value = value;
        }

        public String getName() {
            return value;
        }
    }

    // Action Enum
    public enum action {
        EXECUTE ("Execute"), 
        DISPLAY ("Display"), 
        CLICK ("Click"), 
        ACCEPT ("Accept");

        private String value;

        private action (String value){
            this.value = value;
        }

        public String getName() {
            return value;
        }
    }   

    // Constructor methods
    public Attribute() {}
    // TODO: Constructor that creates an Attribute of type System or Action

}
我找遍了,但找不到一个例子。我有一个Java类属性,它需要从几个枚举之一获取值

例如,商店可能出售水果、蔬菜或肉类

水果枚举可能采用以下值:苹果、橙子

蔬菜枚举可能采用以下值:豌豆、胡萝卜

肉类枚举可能采用以下值:牛肉、鸡肉

我希望Store类包含类型为Fruit、vegeture或Meat的属性,以便设置必要的值


提前谢谢

我肯定我会收到反对票,我会在几票之后删除答案。我绝对不主张这样的做法

static interface Item
{
    public String name();
}

static enum Fruit implements Item { Apples, Oranges, Pears };
static enum Vegetable implements Item { Carrots, Peas, Potatoes };
static enum Meat implements Item{ Beef, Chicken };
static enum Seafood implements Item
{ Salmon, Trout, Halibut, Shrimp };


static class GeneralStore
{
    List<Item> items = new ArrayList<>();

    public void addItem(Item it)
    {
        items.add(it);
    }

    public List<Item> getItems()
    {
        return Collections.unmodifiableList(items);
    }
}


public static void main(String[] args)
{
    GeneralStore gs = new GeneralStore();

    Item itf = Fruit.Apples;
    gs.addItem(itf);

    Item itm = Meat.Beef;
    gs.addItem(itm);


    System.out.println(gs.getItems());

    for (Item it : gs.getItems()) {
        // call the method on the interface
        System.out.println(it.name());
    }
}
基本方法可以通过使用接口来实现。需要考虑接口的具体方法。为了便于说明,我只提供了一个例子

编辑:从界面中删除
。正如在评论中正确指出的那样,这种方法实际上并不需要

static interface Item
{
    public String name();
}

static enum Fruit implements Item { Apples, Oranges, Pears };
static enum Vegetable implements Item { Carrots, Peas, Potatoes };
static enum Meat implements Item{ Beef, Chicken };
static enum Seafood implements Item
{ Salmon, Trout, Halibut, Shrimp };


static class GeneralStore
{
    List<Item> items = new ArrayList<>();

    public void addItem(Item it)
    {
        items.add(it);
    }

    public List<Item> getItems()
    {
        return Collections.unmodifiableList(items);
    }
}


public static void main(String[] args)
{
    GeneralStore gs = new GeneralStore();

    Item itf = Fruit.Apples;
    gs.addItem(itf);

    Item itm = Meat.Beef;
    gs.addItem(itm);


    System.out.println(gs.getItems());

    for (Item it : gs.getItems()) {
        // call the method on the interface
        System.out.println(it.name());
    }
}
静态接口项
{
公共字符串名称();
}
静态枚举水果实现项{苹果、桔子、梨};
静态枚举蔬菜实现项{胡萝卜、豌豆、土豆};
静态枚举肉类工具项{牛肉、鸡肉};
静态枚举项
{鲑鱼、鳟鱼、大比目鱼、虾};
静态类通用存储
{
列表项=新建ArrayList();
公共无效附加项(项目it)
{
项目。添加(it);
}
公共列表getItems()
{
返回集合。不可修改列表(项目);
}
}
公共静态void main(字符串[]args)
{
GeneralStore gs=新的GeneralStore();
itf项=水果、苹果;
一般事务补充条款(itf);
itm项目=肉、牛肉;
附加条款(itm);
System.out.println(gs.getItems());
对于(项目it:gs.getItems()){
//调用接口上的方法
System.out.println(it.name());
}
}
样本输出:

[苹果、牛肉]
苹果
牛肉

可以推导出原始类,但如果有足够的通用性,接口方法就可以工作。这在很大程度上取决于用例


欢迎提供建设性反馈以改进答案。

您的要求并不明确,但听起来您可能正在寻找:


编辑之后,我想您可能需要
属性
作为枚举的公共接口:

public interface Attribute {
    String getName();
}

public enum Subsystem implements Attribute {
    PROCESSOR ("Processor"), 
    MONITOR ("Monitor"), 
    MOUSE ("Mouse"), 
    KEYBOARD ("Keyboard");

    private final String value;

    private Subsystem(String value){
        this.value = value;
    }

    @Override
    public String getName() {
        return value;
    }
}

public enum Action implements Attribute {
    EXECUTE ("Execute"), 
    DISPLAY ("Display"), 
    CLICK ("Click"), 
    ACCEPT ("Accept");

    private final String value;

    private Action(String value){
        this.value = value;
    }

    @Override
    public String getName() {
        return value;
    }
}  
现在您可以执行以下操作:

Attribute a1 = Subsystem.PROCESSOR;
Attribute a2 = Action.EXECUTE;

我们中的大多数人更愿意帮助那些表现出一点点努力的人。我们是志愿者,这样做很有趣。@Andreas:枚举也可以共享一个接口…操作、动作和子系统包含正交信息,因此您肯定不希望单个字段包含其中一个的信息。您需要创建两个字段,每种类型的枚举对应一个字段。这个问题的要旨是建议一个人使用特定的方法。也许解释真正需要完成的事情会更好。似乎有点像。由于问题的改进,关闭投票被删除,向下投票改为向上投票。谢谢特德的努力,谢谢!我肯定会看看如何使用界面为什么要添加通用的
?“这没什么用。”安德烈亚斯,一个公平的问题。当我第一次开始编写时,我想到了一个稍微不同的实现,但是没有它的接口工作得很好(正如shmosel的回答所示)。可以在不影响功能的情况下删除它。我将通过删除它们来更新答案。谢谢你的反馈。谢谢!我将看看泛型类是否适用于me@Ted,出于好奇,您想要哪种解决方案?我使用了界面。很好用,谢谢!
Attribute a1 = Subsystem.PROCESSOR;
Attribute a2 = Action.EXECUTE;