【问题标题】:using inner classes in Java - enum在 Java 中使用内部类 - 枚举
【发布时间】:2012-04-28 10:09:09
【问题描述】:

我有一个与内部类有关的非常具体的问题。让我给你看一些示例代码:

class Foo {
    MYOPTIONS temp;

    public static enum MYOPTIONS {
        OPTION1, OPTION2, OPTION3;
    } 
}

所以这个枚举在类 Foo 中。现在我想做的是将 temp 变量设置为三个选项之一,但是在类 Foo 之外执行此操作,比如说从一个名为 External 的类中。不幸的是,我无法使用 set 方法来执行此操作,因为 External.setTemp (MYOPTIONS.OPTION1) 无效,因为枚举在外部类中不可见。 所以我唯一能想到的就是在 Foo 类中有三个方法:

public void setTempOption1 () {this.temp=MYOPTIONS.OPTION1;}
public void setTempOption2 () {this.temp=MYOPTIONS.OPTION2;}
public void setTempOption3 () {this.temp=MYOPTIONS.OPTION3;}

显然,另一种选择是更改枚举而不将其作为内部类。 我还有其他选择吗? 谢谢

【问题讨论】:

  • 你不需要改变枚举,你只需要使内部类(Foo)不是内部的
  • 作用域在相反的方向上不起作用。如果您在方法中声明一个变量,您不希望它在方法之外定义。这是同一个概念,只是以更抽象的方式。
  • 如果你使用 Eclipse,有一些重构工具可以自动将枚举或类移动到它自己的文件中,并使其成为公共或包私有
  • Foo 不是内部类,MYOPTIONS 是,我不知道为什么我用大写字母写它:P 似乎除了我自己建议的 2 之外,我没有其他选择。
  • OPTION 2 空格太多,需要逗号,OPTION3 需要分号。显示测试代码并使用正确的缩进会很好。

标签: java enums inner-classes


【解决方案1】:
class ContainsInnerEnum {
    MYOPTIONS temp;

    public enum MYOPTIONS {
        OPTION1, OPTION2, OPTION3;
    } 
}

class EnumTester {
    public void test () {
        ContainsInnerEnum ie = new ContainsInnerEnum ();
        // fail:
        // ie.temp = MYOPTIONS.OPTION1;
        // works:
        ie.temp = ContainsInnerEnum.MYOPTIONS.OPTION1;
    }       
}

MYOPTIONS 的全名包含嵌入类名称。

【讨论】:

【解决方案2】:

声明有效,但你必须这样使用:

Foo.MYOPTIONS var = Foo.MYOPTIONS.OPTION1

您在使用“枚举”时缺少类的名称。

【讨论】:

    【解决方案3】:

    你可以这样做:

    Foo f = ...;
    f.temp = Foo.MYOPTIONS.OPTION1;
    

    虽然我也建议将MYOPTIONS 外部化。

    【讨论】:

      【解决方案4】:

      使用MYPOTIONS枚举时必须参考Foo

      public class Uta {
          public static void main(String[] args) {
              Foo foo = new Foo();
              foo.temp = Foo.MYOPTIONS.OPTION1;
          }
      }
      

      假设类Foo在包foo中(你应该总是组织classes in packages),那么你也可以使用static imports,让你的代码更干净一点:

      package foo;
      
      import static foo.Foo.MYOPTIONS.OPTION1;
      
      public class Uta {
          public static void main(String[] args) {
              Foo foo = new Foo();
              foo.temp = OPTION1;
          }
      }
      

      【讨论】:

        【解决方案5】:

        在内部,每个枚举常量都返回枚举类型的对象;(即 Foo.MYOPTIONS.OPTION1 返回类型为 MYOPTIONS 的对象)所以我们不能创建自己的实例(即 new Foo.MYOPTIONS();不允许显式创建枚举对象因为 num 本身提供了对象)

        所以,如果我们想默认打印引用变量 .toString();方法将被调用。在枚举 toString();方法被覆盖并返回常量的名称。所以我们可以在一行中同时拥有 Object 和 enum 常量 (即 Foo.MYOPTIONS.OPTION1) 示例:

            class Foo {
                MYOPTIONS temp;
        
                public static enum MYOPTIONS {
                    OPTION1, OPTION2, OPTION3;
                } 
            }
        
        public class Main
        {
            public static void main(String[] args) {
                Foo foo=new Foo();
                foo.temp = Foo.MYOPTIONS.OPTION1;
                System.out.println(foo.temp);
            }
        }
        

        就是这样,如果你写这行来显式实例化枚举对象

        (foo.temp = new Foo.MYOPTIONS();)

        enter code here
        

        你会得到如下编译时错误:--

        错误:枚举类型可能无法实例化

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-19
          • 2022-07-06
          • 1970-01-01
          • 2017-08-16
          相关资源
          最近更新 更多