一叶笑天
雄关漫道真如铁, 而今迈步从头越。 从头越, 苍山如海, 残阳如血。
posts - 73,comments - 7,trackbacks - 0
在Jdk1.5之前有两种方式实现单例。它们都是采用维护私有构造器并且暴露一个static的成员函数来提供访问单一实例对象。第一种方式是将成员变量声明为final类型,例如:
// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis()  }
public void leaveTheBuilding()  }
}
另外一种方式是采用一个static的工厂方法:例如
// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis()  }
public static Elvis getInstance() return INSTANCE; }
public void leaveTheBuilding()  }
}
public field方式的主要优势是在于清楚的声明了指定的类是单例的。
static的工厂方法优势在于可以灵活设置指定的类应不应该在不改变它的API的前提下是不是一个单例。
为了实现用前面介绍的方式来实现单例的serializable,不能仅仅增加implement Serializable。为了一直保持单例状态,必须声明所有的属性为transient,而且提供一个readResolve方法。否则当一个类反序列化的时候,新的实例将会随之生成。为了保持Elvis类单例,可以增加下面的函数:
// readResolve method to preserve singleton property
private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE;
}
在1.5中,还可以用另外一种方式实现单例。使用enum来保持类单例:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding()  }
}
除了它更简明,这种方式等同于public属性方式。免费提供了序列化机制,即使面对尖端的序列化或者反射攻击,它都提供了坚实的单例。
结论:
这种方式还需要广泛的采纳,
元素级的单例枚举类型是最好的实现单例的方法。
While this approach has yet to be widely
adopted, a single-element enum type is the best way to implement a singleton.
posted on 2008-06-18 21:49 一叶笑天 阅读(365) 评论(0)  编辑  收藏 所属分类: JAVA技术

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


网站导航: