2011-06-26 95 views
0

我在我的应用程序(java)中遇到了一个奇怪的问题。java - 一个枚举问题

我有一个枚举。这样

public enum myEnum implement myIntrface{ 
    valueA(1),valueb(2),valuec(3),valued(4) 
    private int i; 
    // and then - a constructor 
    public MyEnum(int number){ 
     i = number; 
    }  


    private MyObj obj = new MyObj; 
    // getter and setter for obj 
} 

,并在另一个类的东西我有这个

MyEnum.valueA.setObj(new Obj(...)) 

在书信 - 我有,有一个集和获得私有实例成员的枚举。

到目前为止好 -

这让我吃惊的是,后来我看MyEnum.valueA价值的唯一的事()obj为null。

没有什么更新值为null,我甚至在构造函数中给它一个默认值,我以后仍然看到它为null。
有什么建议吗?

+1

你能发布一个完整的可编译示例来演示这个问题吗? –

+0

public MyEnum(int number)不是构造函数。枚举名称是myEnum。名称中没有大写m – Sean

+1

另外,枚举不能有公共构造函数... –

回答

0

枚举的目的是表示常量值。设置恒定值的字段没有任何意义。

你应该声明你的字段为final,并使用构造函数初始化它们。

+0

它可能没有意义,但它是允许的。 –

0

仅供参考,下面的代码按预期工作:

public class Test { 

    public static enum MyEnum { 
     valueA(1),valueb(2),valuec(3),valued(4); 
     private int i; 
     private Object o; 

     private MyEnum(int number) { 
      i = number; 
     } 

     public void set(Object o) { 
      this.o = o; 
     } 

     public Object get() { 
      return o; 
     } 


    } 

    public static void main(String[] args) { 
     System.out.println(MyEnum.valueA.get()); // prints "null" 
     MyEnum.valueA.set(new Integer(42)); 
     System.out.println(MyEnum.valueA.get()); // prints "42" 
    } 
} 
1

枚举应该是无修改的类,所以你真不该这样做。如果您希望修改像枚举类型的基于类型的对象的状态,则应该使用带嵌入常量的最终类方法。下面是基于类的方法的一个示例,其中可修改的名称和不可修改的名称...

public final class Connection { 

    public static final Connection EMAIL = new Connection("email"); 
    public static final Connection PHONE = new Connection("phone"); 
    public static final Connection FAX = new Connection("fax"); 
    /**/ 
    private final String unmodifiableName; //<-- it's final 
    private String modifiableName; 

    /* 
    * The constructor is private so no new connections can be created outside. 
    */ 
    private Connection(String name) { 
     this.unmodifiableName = name; 
    } 

    public String getUnmodifiableName() { 
     return unmodifiableName; 
    } 

    public String getModifiableName() { 
     return modifiableName; 
    } 

    public void setModifiableName(String modifiableName) { 
     this.modifiableName = modifiableName; 
    } 

}