最爱Java

书山有路勤为径,学海无涯苦作舟

org.apache.commons.lang.enums学习笔记

    在org.apache.commons.lang.enums包中只有3个类,主要是实现了枚举类的操作。
    Enum - 用于实现枚举;
    EnumUtils - 用于简化枚举类的操作;
    ValuedEnum - 另一种带有int值的枚举类型,主要用于switch语句。
    虽然JDK 1.5以上已经自带了Enums类型,但这两者还是有些区别的:标准的Enums是一个内置的数据类型,不是一个超类;因为不是一个超类,所以不能继承,也没有Lang包中Enum类的方法;Lang包中的enum名字可以通过getName()获得,而标准的Enums则只返回其类的名字。当然,Apache组织还是希望没必要的情况下,不要使用Lang包下的Enum类,因为Enum类是单独实现枚举用途的,和标准的Enums没有任何关系,所以两者之间将无法转换。
    Enum类和ValuedEnum类的使用方法很简单,在APIDOC中有详细的例子。就不再这里重复了。但需要说一下EnumUtils这个类,这个类个人认为在jdk 1.5以后是一个无效类。我们看下面的例子:

package test.org.apache.commons.lang.enums;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.enums.EnumUtils;

public class EnumsTest {
    
public static void main(String[] args) {
        System.out.println(
"start");
        Iterator it 
= EnumUtils.iterator(StudentEnum.class);
        
while (it.hasNext()) {
            System.out.println(it.next());
        }

        
        it 
= StudentEnum.iterator();
        
while (it.hasNext()) {
            System.out.println(it.next());
        }

        
        it 
= EnumUtils.iterator(StudentEnum.class);
        
while (it.hasNext()) {
            System.out.println(it.next());
        }
        
        System.out.println(
"end");
    }

}


    从设计角度,应该打印出三遍StudentEnum中的数据,但实际上只打印出了两遍。第一次调用EnumUtils.iterator()方法的时候,返回的是空Iterator。这主要是jdk 1.5以后类的加载机制发生了变化,也就是static字段的加载时机改变了。在例子中,到StudentEnum.iterator()语句时,StudentEnum类才被加载,StudentEnum的static字段才被初始化。而EnumUtils所有方法都是访问static字段的,所以在被访问的类没有实际加载之前,是访问不到任何数据的。这个问题在Apache的论坛上已经被提及。

posted on 2009-01-05 14:00 Brian 阅读(1354) 评论(0)  编辑  收藏 所属分类: Jakarta Commons笔记


只有注册用户登录后才能发表评论。


网站导航:
 

公告


导航

<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(4)

随笔分类

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜