2014-09-24 5 views
15

Я часто ситуации, когда мне нужно переменный для класса, который может быть представлен в виде простого перечислимого типа, например:Перечисление переименования Java?

private enum PageOrder {DOWN_THEN_OVER, OVER_THEN_DOWN}; 

Если объявить тип перечисления внутри класса, который содержит переменный, то у меня есть использовать квалифицированное имя MyClass.PageOrder, что неудобно. Но если я создаю новый класс, у меня есть класс для простой декларации перечисления, которая кажется излишней для меня.

По этой причине я часто использую целые числа вместо типа перечисления.

Любые комментарии/предложения по этой теме?

+26

Никогда не «исправляйте» правильное решение для неправильного, просто чтобы сохранить ввод. – biziclop

+1

"* Но если я создаю новый класс, у меня есть класс для простой декларации перечисления, которая кажется излишней для меня *" - где перегиб? Частное перечисление также является классом (со своим собственным .class-файлом) - он имеет только различную видимость. –

+5

Перечисление в собственном файле может показаться излишним, но это не так. Это вполне уместно, и это хороший дизайн. Добавьте полезный javadoc в класс enum и к каждой из его констант, и вы обнаружите, что исходный файл не будет выглядеть почти таким же скудным. Существует законное использование для внутренних классов, но создание чего-то внутреннего класса просто потому, что его собственный файл будет «слишком тяжелым», не является веской причиной. – VGR

ответ

34

Вы можете сделать

import static yourpkg.MyClass.PageOrder; 

Это всегда будет работать, так как inner enums are always static. Обратите внимание, что это работает даже в файле, который определяет класс MyClass.

+4

И вы можете настроить Eclipse для автоматического вставки статического импорта. – biziclop

+2

Yup. Как объяснено [здесь] (http: // stackoverflow.ком/вопросы/288861/затмение-оптимизируют-импорт-к-включают антистатики-импорт). – aioobe

+1

Перечисления избегают двусмысленности или просто загадочного кода. 'renderPage (1)' не так информативен, как 'renderPage (OVER_THEN_DOWN)'. – sfdcfox

21

По этой причине я часто использую целые числа вместо типа перечисления.

Пожалуйста, не делайте этого.

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

class Page { 
    enum Order { 
     DOWN_THEN_OVER, OVER_THEN_DOWN; 
    } 
} 

// Accessing: A little verbose but clear and efficient. 
Page.Order order = Page.Order.DOWN_THEN_OVER; 

Вы можете также static import каждый enum вы используете, но я предпочитаю многословие выше.

import static com.oldcurmudgeon.test.Test.Order.DOWN_THEN_OVER; 
import static com.oldcurmudgeon.test.Test.Order.OVER_THEN_DOWN; 

public class Test { 

    enum Order { 

     DOWN_THEN_OVER, OVER_THEN_DOWN; 
    } 

    public void test() { 
     Order pageOrder = DOWN_THEN_OVER; 
    } 

} 

Очевидно, что вы не можете принять этот подход, если enum является private.

+1

Альтернативой перечислению является использование 'public static final int DOWN_THEN_OVER = 0; public static final int OVER_THEN_DOWN = 1; 'и мне кажется, что оба они одинаково читабельны и поддерживаются для небольшого набора значений. –

+0

int DOWN_THEN_OVER = 1; int OVER_THEN_DOWN = 1; int wackyDuck = 1;/* DOWN_THAN_OVER, сохраненный как int, может быть таким же, как OVER_THAN_DOWN или просто дурацкая утка */ –

+2

@JohnHenkel - 'public static final int DOWN_THEN_OVER = 0; public static final int OVER_THEN_DOWN = 1; ... public static final int UP_THEN_AT_THEM = 92367; '-' turnPage (UP_THEN_AT_THEM) '- вы видите опасность сейчас? С 'enum' вы просто не можете этого сделать - даже по ошибке. – OldCurmudgeon

-2

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

Если вы хотите напечатать значение перечисления в удобном для пользователя формате или преобразовать значение в перечисление, вам, вероятно, понадобится класс.

Смежные вопросы