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