2016-01-24 69 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...} 
0123將是有益的
  • 這將需要時間,並給我一個更好的概述
  • 的Java已經知道我的目標類型是「動物」,所以在我看來,這是不必要的(?)

所以,我只是想知道,如果這有可能以任何方式,爲什麼不呢?

+0

請注意,上面寫的內容和enums的'switch'語法之間存在着明顯的差異:這種switch語句中的'cases'不可以是'case animals.CAT:'等等,但是它們必須是' 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()自動拉入。