深入浅出J2SE 5.0 枚举类型
那么,欢呼吧!!!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<E extends Enum<E>>。
我的第一反应是"这是他妈的什么意思?” 答案在下面,但是我们要先热热身。
Foo<T> 的真正含义是啥米?
你的大脑神经元已经在Java 代码List<String>和“基于String的List容器”建立了联系,但是当你看到Foo<String> 这究竟是什么意思呢?
考虑下面的代码
T 是一个类型参数(A),其意味着Foo的class body实际上已经被某种类型(任何类型)T所参数化。1。类型T(几乎)可以出现在class body的任何地方而不用担心T实际上是什么类型。
2。类型参数的语义取决于编写类Foo的人。集合类使用类型参数来表明“这个一个T的集合”;其语义可以在javadoc中找到。对于更加通用的Foo<T>的不再是T的容器。
3。这里真正要说的是 ,类型参数实际上允许用户在调用函数方法的时候,不用cast就可以使用特定类型
那么java.lang.Class<T>意味着什么呢?
如果你查看JDK 1.5 javadoc,你就会发现java.lang.class如今有了一个类型参数ava.lang.Class<T>。
那么,Class并不是Collections API,你的大脑神元经将怎么办呢?可以观察Foo.class这个静态属性,其返回的不再是class,而是Class<Foo>。
Class的类型参数告诉用户其究竟代表是那个类型,允许用户在不cast的情况下就调用Class的某些方法。
以newInstance() 和cast()为例,两者都能返回一个类型确定为T的对象。
Java代码
Class<Date> c1 = Date.class;
Class c2 = Date.class;
Date d1 = c1.newInstance();; // 新的用法,不再有ClassCastException
Date d2 = (Date); c2.newInstance();; // 过去的用法
Object o = d1;
// 不再需要手工的cast
// 必要的时候抛出ClassCastException
Date d3 = c1.cast(o);;
// 过去的用法,需要手工cast
Date d4 = (D
补充:软件开发 , Java ,