Swa*_*rma 2 java singleton design-patterns
如果我们将类实现为单例,我们将执行以下操作
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()
{
}
}
Run Code Online (Sandbox Code Playgroud)
考虑到上述情况,覆盖clone()以及防止类的多个实例是一个好主意吗?
界面中没有clone()方法Cloneable.正如@Ivan指出的那样,如果你的类没有实现,Cloneable那么调用Single#clone()将抛出一个CloneNotSupportedException.
也就是说,克隆是目前编写良好的Java中不常发生的事情.正如Josh Bloch在Effective Java中所写,第11项:
该
Cloneable接口旨在作为mixin接口(第18项),用于宣传他们允许克隆的对象.不幸的是,它没有达到这个目的.它的主要缺陷是它没有clone方法,并且Object克隆方法受到保护.如果不采用反射(第53项),clone就不能仅仅因为它实现而在对象上调用方法Cloneable.即使是反射调用也可能失败,因为无法保证对象具有可访问的clone方法.尽管有这个缺陷和其他设施,该设施已广泛使用,因此了解它是值得的.
...基本上,人们不/不应该使用clone().它是一个设计糟糕的界面,如果你想让你的对象可以克隆,最好提供一个复制构造函数或复制工厂方法(从第11项中窃取的代码):
public Yum(Yum yum); // copy constructor
public static Yum newInstance(Yum yum); // copy factory
Run Code Online (Sandbox Code Playgroud)
虽然我在谈论Effective Java,但是有一种更好的方法来编写单例,假设你真的需要一个(这是一个很大的if!).
从版本1.5开始,有第三种方法来实现单例.只需使用一个元素创建一个枚举类型:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
Run Code Online (Sandbox Code Playgroud)
这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多实例化的铁定保证,即使面对复杂的序列化或反射攻击.虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法.
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |