Могу ли я сделать статический импорт частного подкласса?

У меня есть закрытое перечисление, которое нельзя показывать вне класса. Можно ли в любом случае выполнить статический импорт этого типа, чтобы мне не приходилось каждый раз вводить тип enum? Или есть лучший способ написать это? Пример:

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
  }
}

6 ответов

Решение

Или есть лучший способ написать это?

Если ваши основные цели состоят в том, чтобы ссылаться на элементы без их квалифицирующего идентификатора перечисления и поддерживать этот список в частном порядке, вы можете отказаться от enum введите всего и используйте обычные частные статические константы.

Вы можете использовать уровень доступа без модификатора, т.е.

enum MyEnum { DOG, CAT }

MyEnum не будет виден классам из других пакетов или из любого подкласса. Это самая близкая форма private, но позволяющая избежать явных ссылок MyEnum,

Учитывая, что вы можете получить доступ к полю полностью квалифицированным, я бы сказал, что это ошибка в компиляторе (или спецификации языка), которую вы не можете статически импортировать.

Я предлагаю вам сделать перечисление защищенным.

Может быть (или не может) быть разумным переместить часть кода в (статические) методы перечисления.

При нажатии вы можете дублировать статические поля во внешнем классе.

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

Не очень, но это возможно.

Вы можете просто написать свой код внутри самого перечисления.

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:
    }
}

Нет, это в значительной степени то, что private это все о.

Другие вопросы по тегам