深入浅出J2SE 5.0 枚举类型(一)

2014-11-24 01:45:27 · 作者: · 浏览: 3

那么,欢呼吧!!!J2SE 5.0 beta已经发布,其中包含了JSR 201 (目前处于public review状态)的实现,JSR 201中包含了新的语言特性:enum,我想我应该去试试看。下面就是得到得到的结果,敢于试试看的就来吧。

深入

这里列出了定义和使用枚举类型的一个例子(取自JSR 201 文档).

Java代码

public class Card

{

public enum Suit {HEART, DIAMOND, CLUB, SPADE};

public enum Rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,

EIGHT, NINE, TEN, JACK, QUEEN, KING};

private final Suit suit;

private final Rank rank;

public Card(Suit suit, Rank rank); {

this.suit = suit;

this.rank = rank;

}

public Suit getSuit(); {

return suit;

}

public Rank getRank(); {

return rank;

}

public String toString(); {

return rank + " of " + suit;

}

public static void main(String... args); {

Card upMySleeve = new Card(Suit.HEART, Rank.ACE);;

System.out.println("what is up my sleeve " + upMySleeve);;

// outputs: what is up my sleeve ACE of HEART

}

}

Java代码

public class Card

{

public enum Suit {HEART, DIAMOND, CLUB, SPADE};

public enum Rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,

EIGHT, NINE, TEN, JACK, QUEEN, KING};

private final Suit suit;

private final Rank rank;

public Card(Suit suit, Rank rank); {

this.suit = suit;

this.rank = rank;

}

public Suit getSuit(); {

return suit;

}

public Rank getRank(); {

return rank;

}

public String toString(); {

return rank + " of " + suit;

}

public static void main(String... args); {

Card upMySleeve = new Card(Suit.HEART, Rank.ACE);;

System.out.println("what is up my sleeve " + upMySleeve);;

// outputs: what is up my sleeve ACE of HEART

}

}

某些语言中,枚举类型只不过是披着羊皮的int。但是在上面的例子中,Suit是一个真正的class。实际上,他是java.lang.Enum的一个子类。

枚举类型Suit经过编译以后的代码可能是这个样子。实际上,枚举类型Suit中的每一个常量都是被声明为public static final的Suit的一个实例。

Java代码

// This is sort of what happens.

public class Suit extends Enum {

public static final Suit HEART = new Suit("HEART", 1);;

public static final Suit DIAMOND = new Suit("DIAMOND", 2);;

public static final Suit CLUB = new Suit("CLUB", 3);;

public static final Suit SPADE = new Suit("SPADE", 4);;

public Suit(String name, int ordinal); { super(name, ordinal);;}

// some more stuff here

}

Java代码

// This is sort of what happens.

public class Suit extends Enum {

public static final Suit HEART = new Suit("HEART", 1);;

public static final Suit DIAMOND = new Suit("DIAMOND", 2);;

public static final Suit CLUB = new Suit("CLUB", 3);;

public static final Suit SPADE = new Suit("SPADE", 4);;

public Suit(String name, int ordinal); { super(name, ordinal);;}

// some more stuff here

}

但是这不是全部,如果你仔细看看java.lang.Enum,你就会张大嘴巴,因为你会看见Enum实际上被声明成一个泛型类Enum>。

我的第一反应是"这是他妈的什么意思?” 答案在下面,但是我们要先热热身。

Foo 的真正含义是啥米

你的大脑神经元已经在Java 代码List和“基于String的List容器”建立了联系,但是当你看到Foo 这究竟是什么意思呢?

考虑下面的代码

T 是一个类型参数(A),其意味着Foo的class body实际上已经被某种类型(任何类型)T所参数化。1。类型T(几乎)可以出现在class body的任何地方而不用担心T实际上是什么类型。

2。类型参数的语义取决于编写类Foo的人。集合类使用类型参数来表明“这个一个T的集合”;其语义可以在javadoc中找到。对于更加通用的Foo的不再是T的容器。

3。这里真正要说的是 ,类型参数实际上允许用户在调用函数方法的时候,不用cast就可以使用特定类型

那么java.lang.Class意味着什么呢?

如果你查看JDK 1.5 javadoc,你就会发现java.lang.class如今有了一个类型参数av