2016-01-24 2 views
2

Я экспериментировал немного с перечислениями и массивов в Java:Java массив с перечислениями

enum animals 
    {CAT, DOG, COW, BIRD, POTATO} 

Чтобы получить это в массив, я просто это сделать ...

animals[] creatures = {animals.CAT, animals.POTATO}; 

Но теперь, если у меня есть определить больше записей, я думал, что было бы полезно, если бы я просто ввести в перечислении без animals.XXX, как я сделать в C++

animals[] creatures = {CAT, POTATO, BIRD, CAT, CAT, POTATO, COW...} 
  • Это займет время и дает мне лучший обзор
  • Java уже знает, что моя цель тип «животные», поэтому, на мой взгляд это лишнее (?)

Так что я просто подумал, это возможно в любом случае, и почему, если нет?

+0

Обратите внимание, что существует явное несоответствие между тем, что вы написали выше, и синтаксисом 'switch' для перечислений:' cases' в таких операциях switch _cannot_ be 'case animals.CAT:' и т. Д., Но вместо этого они _must_ be ' case CAT: 'в отличие от их использования в инициализаторе массива. Таким образом, вы можете увеличить свой вопрос, спросив, может ли я (на самом деле должен) оставить квалификатор в операторах 'case', почему я не могу сделать то же самое в инициализаторах массива? (И наоборот, конечно.) –

ответ

3

Java обязуется использовать полностью классифицированное имя для его использования. Для стандартных классов это обычно делается путем импорта пакета с import name.of.package, а затем с использованием простого имени класса. Для статических полей, таких как константы перечисления, вы можете использовать статический импорт.

import static animals.CAT; 
import static animals.POTATO; 
import static animals.BIRD; 
import static animals.COW; 

// ... 

animals[] creatures = {CAT, POTATO, BIRD, CAT, CAT, POTATO, COW...}; 

Вы также можете использовать

import static animals.*; 

избежать необходимости импортировать каждые животных, но учтите, что первый конструкт is generally considered better than the second one.

+0

Спасибо! Не думал об этом, но он кажется очень разумным и работает как шарм – Jojo

1

Прежде всего, enum следует называть Animals, так как типы должны начинаться с буквы верхнего регистра.

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

int x = <expression>; 
int[] x = {<expression>, <expression>, ...}; 
Animals x = <expression>; 
Animals[] x = {<expression>, <expression>, ...}; 

Единственное место enum значение не нужно быть квалифицированным, находится в switch заявлении, потому что значение case должно быть постоянным, а не выражение:

switch (animal) { 
    case CAT: 
     // code 
     break; 
    case DOG: 
     // code 
     break; 
} 

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

0

Хотя есть другие решения, которые будут работать, вам не нужно действительно проходить через это. Вместо этого вы можете использовать массив values(), чтобы вытащить все текущие значения, прикрепленные к массиву.

То есть, если вы действительно хотите иметь массив называется creatures, содержащий все записи вашего перечисления, вы можете выразить, что, как это:

// Classes, interfaces, and enums should start with an upper case 
Animals[] creatures = Animals.values(); 

Если добавить новую запись в перечислении она будет автоматически втягивается через values().

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