当前位置:编程学习 > JAVA >>

深入浅出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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,