2011-06-26 112 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; 
    } 

}