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