2012-07-10 97 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