Могу ли я сделать статический импорт частного подкласса? - PullRequest
7 голосов
/ 12 января 2010

У меня есть личное перечисление, которое нельзя показывать вне класса. Можно ли в любом случае выполнить статический импорт этого типа, чтобы мне не приходилось каждый раз вводить тип 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 ]

6 голосов
/ 12 января 2010

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

enum MyEnum { DOG, CAT }

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

3 голосов
/ 12 января 2010

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

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

2 голосов
/ 12 января 2010

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

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

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

Неудачно, но возможно.

2 голосов
/ 12 января 2010

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

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

0 голосов
/ 12 января 2010

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

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:
    }
}
0 голосов
/ 12 января 2010

Нет, это почти то же самое, что и private.

...