6.枚舉
枚舉使你能夠指定一組對象,例如:
聲明:
public enum Direction {North, East, West, South};
使用:
Direction wall = Direction.North;
這真是個優雅的概念,這也是C#為什麼會決定保留它們的原因,但是,為什麼Java卻選擇了拋棄?在Java中,你不得不這麼做:
聲明:
public class Direction
{
public final static int NORTH = 1;
public final static int EAST = 2;
public final static int WEST = 3;
public final static int SOUTH = 4;
}
使用:
int wall = Direction.NORTH;
看起來好像Java版的更富有表達力,但事實並非如此。它不是類型安全的,你可能一不小心會把任何int型的值賦給wall而編譯器不會發出任何抱怨【譯注:你顯然不可以這麼寫:Direction wall = Direction.NORTH;】。
坦白地說,在我的Java編程經歷裡,我從未因為該處非類型安全而花費太多的時間寫一些額外的東西來捕捉錯誤。但是,能擁有枚舉是一件快事。C#帶給你的一個驚喜是—當你調試程序時,如果你在使用枚舉變量的地方設置斷點,調試器將自動譯解direction並給你一個可讀的信息,而不是一個你自己不得不譯解的數值:
聲明:
public enum Direction {North=1, East=2, West=4, South=8};
使用:
Direction direction = Direction.North | Direction.West;
if ((direction & Direction.North) != 0)
//....
如果你在if語句上設置斷點,你將得到一個你可讀的direction而不是數值5。
【譯注:這個例子改一下,會更有助於理解:
聲明:
public enum Direction {North=1, East=2, West=4, South=8, Middle = 5/*注意此處代碼*/};
使用:
Direction direction = Direction.North | Direction.West;
if ((direction & Direction.North) != 0)
//....
如果你在if語句上設置斷點,你將得到一個可讀性好的direction(即Middle)而不是數值5】
【作者注:枚舉被Java拋棄的原因極有可能是因為它可以用類代替。正如我上面提到的,單單用類我們不能夠象用別的概念一樣更好地表達某個特性。Java的“如果它可以用類處理,那就不引入一個新的結構”的哲學的優點何在?看起來最大的優點是簡單—較短的學習曲線,並且無需程序員去考慮做同一件事的多種方式。實際上,Java語言在很多方面都以簡化為目標來改進C++,比如不用指針,不用頭文件,以及單根對象層次等。所有這些簡化的共性是它們實際上使得編程—唔—簡單了,可是,沒有我們剛才提到的枚舉、屬性和事件等等,反而使你的代碼更加復雜了】