如果我们将一个类实现为单例,我们将执行以下操作
class Single
{
private Single singleton;
public static Single getInstance()
{
if(null == singleton)
{
singleton = new Single();
}
return singleton;
}
//then we make the constructor private
private Single()
{
}
}考虑到上述情况,重写clone()是否也是一个好主意,以防止类的多个实例?
发布于 2011-02-08 06:33:27
Cloneable接口中没有clone()方法。作为@Ivan points out,如果您的类没有实现Cloneable,则使用calling Single#clone() will throw a CloneNotSupportedException。
也就是说,如今在编写良好的Java中,克隆很少发生。正如Josh Bloch在Effective Java中所写的,第11项:
Cloneable接口旨在作为对象的mixin接口(第18项),以通告它们允许克隆。不幸的是,它不能达到这个目的。它的主要缺陷是缺少clone方法,而Object的克隆方法是受保护的。如果不借助反射(第53项),就不能仅仅因为对象实现了Cloneable就对它调用clone方法。即使是反射调用也可能失败,因为不能保证对象有一个可访问的clone方法。尽管有这个缺陷和其他缺陷,但该工具得到了广泛的使用,因此理解它是值得的。
...basically,人们不/不应该使用clone()。这是一个设计很差的接口,如果你想让你的对象是可克隆的,最好提供一个复制构造函数或复制工厂方法(代码从第11条窃取):
public Yum(Yum yum); // copy constructor
public static Yum newInstance(Yum yum); // copy factory虽然我讨论的是高效Java,但假设您的确实需要一个(这是一个很大的假设!),那么有一种更好的方法来编写单例。
从1.5版开始,有第三种实现单例的方法。只需创建一个只有一个元素的枚举类型:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}这种方法在功能上等同于公共字段方法,只是它更简洁,免费提供序列化机制,并提供针对多个实例化的铁板一块的保证,即使面对复杂的序列化或反射攻击。虽然这种方法还没有被广泛采用,但单元素枚举类型是实现单例的最佳方式。
发布于 2011-02-08 06:33:03
如果你不实现克隆,它就不应该是可克隆的。附注:一个更简洁的java单曲是:
class Single {
private static final Single singleton = new Single();
private Single() { }
public static Single getInstance() {
return single;
}
}发布于 2011-02-08 06:38:14
对单例对象的任何clone()调用都将失败,如下所述:
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone%28%29
如果类不是Cloneable (未指定implements Cloneable),则将抛出CloneNotSupportedException错误。
所以不,这是没有必要的。代码越少越好:)
https://stackoverflow.com/questions/4927429
复制相似问题