2012-03-31 72 views
1

我是java编程中的新手,并试图学习它。 我遇到了无法找到在网络它可以解决的问题:内联实例化类作为Enum中的参数

我有一个枚举,这是一个行动“清单”和他们每个人都有型操作的属性 是conains列表可能的子活动。子区是常量字符串。

我想instanziate操作的anonymus实例在枚举构造函数,以便 除了非标准子操作,每个枚举可以有它的辅助作用

我试着写像下面

枚举
public enum Action { 
    ACTION1("One", new Actions(){ 
     public static final String TEST = "test"; 
    }), 
    ACTION2("TWO", null), 
    ACTION3("THREE,null); 

    private final String act; 
    public final Actions actions; 

    private Action(String act, Actions actions) { 
     this.act = act; 
     this.actions = actions; 
    } 
} 

,这是操作类

public class Actions { 
    public static final String SUBACTION_TEST1 = "suoOne"; 
    public static final String SUBACTION_TEST2 = "subTwo"; 
} 

不是,这是我如何使用操作枚举:

String as = Action.ACTION1.params.SUBACTION_TEST1; 

,并到这里就wors但I'cannot这样写:

String ast = Action.ACTION1.params.TEST; 

我知道,也许这种做法是错误的,但改变之前,我想执行 知道为什么没有按没有工作。

谢谢。

+0

我想你意思是“行动”而不是“参数”。 'actions'有一个'Actions'类型,它没有字段TEST。如果它有一个名字,你可以投到“Actions”的子类,但它不是 – 2012-03-31 13:49:46

+0

,所以我的目标是希望使用这个代码? – 2012-03-31 14:01:34

+0

我认为它值得回顾一下你想做什么,看看它是否能以另一种方式完成。 – 2012-03-31 14:07:24

回答

3

您的枚举没有名为params的属性,这是您的代码示例不起作用的直接原因。有一两件事你可以做些什么来改善这样的设计,是让你Actions类通过一个定义良好的方法返回的子操作列表:

public class Actions { 
    public static final String SUBACTION_TEST1 = "suoOne"; 
    public static final String SUBACTION_TEST2 = "subTwo"; 

    public List<String> getSubActions() { 
     return Arrays.asList(SUBACTION_TEST1, SUBACTION_TEST2); 
    } 
} 

public enum Action { 
    ACTION1("One", new Actions(){ 
     public static final String TEST = "test"; 

     @Override 
     public List<String> getSubActions() { 
      return Arrays.asList(TEST); 
     } 
    }), 

    private final String act; 
    private final Actions actions; 

    private Action(String act, Actions actions) { 
     this.act = act; 
     this.actions = actions; 
    } 

    public Actions getActions() { 
     return actions; 
    } 
} 

,并使用此:

List<String> subActionList = Action.ACTION1.getSubActions(); 
+0

是的,你是对的,但参数是我减少这篇文章的原始代码的残余。 String as = Action.ACTION1.actions.SUBACTION_TEST1; << ---这是正确的 但我想用这个语法来访问子对象: String as = Action.ACTION1.actions.TEST; – 2012-03-31 13:57:12

+0

@EmergencyExit - Java中不支持这种动态属性访问。 'Action.ACTION1.actions'解析为'Actions'类,而不是您在枚举中定义的内部类。 – Perception 2012-03-31 14:15:14

+0

谢谢。我会改变代码。 – 2012-03-31 14:26:58