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

时间:2016-05-12 01:06:52

标签: java enums

EDIT2:更多解释。

这个概念是用“短语”构建的句子,它只是字符串,而“属性”只能是特定的单词。

示例:“系统”将“操作

系统动作(属性)只能是某些单词,所以我希望它们是枚举。但我也认为一般来说他们都在完成同样的事情,所以我想我会创建一个名为Attribute的类,它可以是System或Action。

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

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

关键部分是最后的未写入构造函数。我希望能够创建系统或动作类型的属性。

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类属性,需要从几个枚举之一中获取值。

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

Fruit enum可能需要值:APPLES,ORANGES。

蔬菜枚举可能取值:PEAS,CARROTS。

肉类枚举可能取值:BEEF,CHICKEN。

我希望Store类包含Fruit,Vegetable或Meat类型的属性,以便我可以设置必需的值。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您的要求并不是很清楚,但听起来您可能正在寻找generic class

class Attribute<T extends Enum<T>> {
    final T value;

    Attribute(T value) {
        this.value = value;
    }
}

现在,您可以使用特定的枚举类型创建Attribute

Attribute<Subsystem> a1 = new Attribute<>(Subsystem.PROCESSOR);
Attribute<Action> a2 = new Attribute<>(Action.EXECUTE);

编辑完成后,我想你可能希望Attribute作为枚举的通用界面:

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;

答案 1 :(得分:1)

我确信我会收到这种方法的downvotes,并且我将删除几个之后的答案。我决不主张采用这种方法。

通过使用接口可以实现基本方法。需要考虑接口的具体方法。为说明目的,我只提供了一个。

修改:从界面中删除<E>。正如评论中正确指出的那样,这种方法并不是真的需要。

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

示例输出:

  

[苹果,牛肉]
  苹果
  牛肉

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

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