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类型的属性,以便我可以设置必需的值。
提前致谢!
答案 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());
}
}
示例输出:
[苹果,牛肉]
苹果
牛肉
可以推导出原始类,但如果有足够的通用性,那么接口方法可以起作用。这在很大程度上取决于用例。
欢迎提供建设性反馈以改善答案。