【原】RSS工具开发手记(07)---Informa的impl.basic包

【原】RSS工具开发手记(07)---Informa的impl.basic包
在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 ([email protected])
 
*/

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”---就好比类的对象当前状态的快照一样。当以后恢复后编译器会自动反序列化对象,同时加上新的变化。


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。

你可能感兴趣的:(【原】RSS工具开发手记(07)---Informa的impl.basic包)