2012-07-10 47 views
2

我有一個內部有2個選項枚舉的Java類。外部類有一個枚舉的成員實例。我有一個方法來切換成員的選項。像這樣:沒有枚舉名的Java引用內部枚舉

public class Foo { 
     public enum BarEnum { 
      OPTION1, OPTION2; 
     } 

     private BarEnum barmember; 

     private void switchBarmember { 
      switch (barmember) { 
       case OPTION1: barmember = BarEnum.OPTION2; break; 
       case OPTION2: barmember = BarEnum.OPTION1; break; 

      } 
     } 
    } 

我的問題是:有沒有說BarEnum.執行修改的方法嗎?換句話說,有沒有一種方法,使該方法是這樣的:

 private void switchBarmember { 
      switch (barmember) { 
       case OPTION1: barmember = OPTION2; break; 
       case OPTION2: barmember = OPTION1; break; 

      } 
     } 

如果沒有辦法,只是讓我知道。謝謝!

回答

2

不完全是,但是這將工作:

public class Foo { 
    public enum BarEnum { 
     OPTION1, 
     OPTION2; 

     private BarEnum switchValue () 
     { 
      switch(this) 
      { 
      case OPTION1: 
       return OPTION2; 
      case OPTION2: 
       return OPTION1; 
      } 

      throw new AssertionError("Should not be here"); 
     } 
    } 

    private BarEnum barmember; 

    private void switchBarmember { 
     barmember = barmember.switchValue(); 
    } 
} 
+0

演示+1我會去在枚舉 – maasg 2012-07-10 21:42:09

+1

@maasg中的方法。這很神奇,但是在大多數Java enum示例中,它被用作C++中的笨笨enum。現在是時候認識到Java'enum'是一個完整的對象! – 2012-07-10 21:45:36

+0

謝謝!我完全忽略了將方法放在'enum'中。 – LastStar007 2012-07-10 21:52:41

1

也許這樣:)

class Foo { 
    public enum BarEnum { 
     OPTION1, OPTION2; 
    } 
    private BarEnum OPTION1=BarEnum.OPTION1; 
    private BarEnum OPTION2=BarEnum.OPTION2; 

    private BarEnum barmember; 

    private void switchBarmember() { 
     switch (barmember) { 
      case OPTION1: barmember = OPTION1; break; 
      case OPTION2: barmember = OPTION2; break; 

     } 
    } 
} 
+0

那樣的違背了封裝常量的目的,但它是很好看的人誰願意打破規則,才能獲得成功。這裏有一些免費的代表。 – LastStar007 2012-07-10 21:56:27

+0

@ LastStar007謝謝,終於有一天我獲得了200個代表:D現在我可以去睡覺 – Pshemo 2012-07-10 21:58:53

1

,除非你創建新的領域,如@Pshemo這樣做是不可能的。

如果此枚舉是在一個單獨的文件,這將是可能靜態導入枚舉常量來實現這一目標:

import static foo.TestEnum.ONE; 
import foo.TestEnum; 

public class StaticImportEnum { 
    public static void main (String[] args) { 
     TestEnum foo = ONE; 
    } 
} 


package foo; 

public enum TestEnum { 
    ONE, TWO; 
} 

但是,您應該謹慎使用靜態導入因爲它們通常被認爲是bad practice

+0

我想過靜態導入,但我不想推翻現有的文件層次結構。此外,在這種情況下,它會違反解放軍。恕我直言,靜態進口只是一種工具,無論好壞,但他們很容易被濫用,這就是爲什麼他們通常不鼓勵。謝謝你的時間。這裏有一些免費的代表。 – LastStar007 2012-07-10 21:55:09

+0

靜態導入也適用於嵌套枚舉,如[這個答案](http://stackoverflow.com/a/1677074/822870) – 2015-09-09 01:07:16