posts - 262,  comments - 221,  trackbacks - 0
在Informa的impl.basic包内,有一个特殊的类:IdGenerator。它负责为其他所有需要标识的对象提供一个全局唯一ID。这个类本身的实现很简单,全部代码如下
import java.util.Random;

/**
 * Identity generator implemented as singleton for generating positive
 * random integers to be used as identify uniquely news channels,
 * items.
 *
 * 
@author Niko Schmuck (niko@nava.de)
 
*/

import de.nava.informa.core.IdGeneratorIF;

public class IdGenerator implements IdGeneratorIF {

    
private static IdGenerator instance;
    
/** used for creating unique item IDs. */
    
private static transient Random rand;

    
private IdGenerator() {
        rand 
= new Random(System.currentTimeMillis());
    }


    
public static IdGenerator getInstance() {
        
if (instance == null{
            instance 
= new IdGenerator();
        }

        
return instance;
    }


    
public long getId() {
        
return 100000l + Math.abs(rand.nextInt());
    }


}

这个ID生成类采用了系统当前时间作为随即数产生的种子,这个并不难理解。但是有一个地方需要我们注意的就是关键字transient的使用。这个关键的作用是告诉编译器假设该类的对象被序列化了,这个值不需要被保存。因为它是“瞬时”的。

这一点和前面我们见到的其它类不同,在impl.basic包下,几乎90%的类都会有这样类似的一句话
private static final long serialVersionUID = -8346101720187629760L;

为什么要加这句话呢?这是因为当我们序列化对象后,对象所属的类仍然可能被改变(例如增加,删除了一个变量),如果我们先序列化后再反序列化会发现编译器报错。此时我们需要加上这个“序列化版本UID”---就好比类的对象当前状态的快照一样。当以后恢复后编译器会自动反序列化对象,同时加上新的变化。


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-12-23 00:03 Paul Lin 阅读(1328) 评论(0)  编辑  收藏 所属分类: J2SE

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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜