【问题标题】:Can I do a static import of a private subclass?我可以对私有子类进行静态导入吗?
【发布时间】:2010-01-12 03:09:53
【问题描述】:

我有一个私有的枚举,不能暴露在课堂之外。无论如何我可以进行该类型的静态导入,这样我就不必每次都输入枚举类型?或者有没有更好的方法来写这个?示例:

package kip.test;

import static kip.test.Test.MyEnum.*; //compile error

public class Test
{
  private static enum MyEnum { DOG, CAT }

  public static void main (String [] args)
  {
    MyEnum dog = MyEnum.DOG; //this works but I don't want to type "MyEnum"
    MyEnum cat = CAT; //compile error, but this is what I want to do
  }
}

【问题讨论】:

    标签: java syntax enums static-import


    【解决方案1】:

    考虑到您可以访问完全限定的字段,我会说这是编译器(或语言规范)中的一个错误,您无法静态导入它。

    我建议你将枚举包保护起来。

    【讨论】:

      【解决方案2】:

      您可以使用无修饰符访问级别,即

      enum MyEnum { DOG, CAT }
      

      MyEnum 不会被其他包中的类看到,也不会被任何子类看到。它是最接近的私有形式,但可让您避免显式引用 MyEnum

      【讨论】:

        【解决方案3】:

        将一些代码移动到枚举的(静态)方法中可能(也可能不)是合理的。

        如果按下,您可以复制外部类中的静态字段。

        private static final MyEnum CAT = MyEnum.CAT;
        private static final MyEnum DOG = MyEnum.DOG;
        

        令人讨厌,但有可能。

        【讨论】:

        • 是的,我也想过这个。我想要么是这个,要么只是使用限定名。两者都不理想,但我认为使用限定名称至少不会出错。
        【解决方案4】:

        您可以简单地在枚举本身中编写代码。

        public enum MyEnum {
        DOG, CAT;
        public static void main(String[] args) {
            MyEnum dog = MyEnum.DOG; // this works but I don't want to have to type
                                        // MyEnum
            MyEnum cat = CAT; // compile error, but this is what I want to do
        }
         }
        

        另一个可以在没有类的情况下引用私有枚举的地方是在 switch 语句中:

        private static enum MyEnum {
            DOG, CAT
        }
        
        public static void main(String[] args) {
            MyEnum e = null;
            switch (e) {
            case DOG:
            case CAT:
            }
        }
        

        【讨论】:

          【解决方案5】:

          或者有没有更好的写法?

          如果您的主要目标是引用没有其限定枚举标识符的项目,并私下维护此列表,您可以完全废弃 enum 类型并使用普通的私有静态常量。

          【讨论】:

          • 不,枚举提供了除封装之外的其他形式的安全性 - 例如,您可以在 switch 语句中使用它们,如果省略一个,您会收到警告。坚持使用限定词 - java 中有更严重的冗长问题;)
          • @akf:Chii 说得对,在我的实际代码中,枚举的一些行为超出了静态常量可以轻松完成的一些行为。我只是为这个问题简化了所有这些,所以这将是最简单的例子。我想我只是坚持使用长限定符名称(不幸的是,在我的实际代码中比“MyEnum”长得多......)
          【解决方案6】:

          不,这就是private 的全部内容。

          【讨论】:

          • 另一方面,外部类可以直接访问所有私有字段和方法。因此,可以提出要导入它的情况。
          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 2014-08-30
          • 1970-01-01
          • 2011-08-04
          • 2022-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多