首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现单例模式

实现单例模式
EN

Stack Overflow用户
提问于 2011-02-08 06:31:22
回答 5查看 1.1K关注 0票数 2

如果我们将一个类实现为单例,我们将执行以下操作

代码语言:javascript
复制
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()是否也是一个好主意,以防止类的多个实例?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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条窃取):

代码语言:javascript
复制
public Yum(Yum yum); // copy constructor
public static Yum newInstance(Yum yum); // copy factory

虽然我讨论的是高效Java,但假设您的确实需要一个(这是一个很大的假设!),那么有一种更好的方法来编写单例。

从1.5版开始,有第三种实现单例的方法。只需创建一个只有一个元素的枚举类型:

代码语言:javascript
复制
// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

这种方法在功能上等同于公共字段方法,只是它更简洁,免费提供序列化机制,并提供针对多个实例化的铁板一块的保证,即使面对复杂的序列化或反射攻击。虽然这种方法还没有被广泛采用,但单元素枚举类型是实现单例的最佳方式。

票数 5
EN

Stack Overflow用户

发布于 2011-02-08 06:33:03

如果你不实现克隆,它就不应该是可克隆的。附注:一个更简洁的java单曲是:

代码语言:javascript
复制
class Single { 
 private static final Single singleton = new Single();
 private Single() { }

 public static Single getInstance() {
  return single;
 }
}
票数 2
EN

Stack Overflow用户

发布于 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错误。

所以不,这是没有必要的。代码越少越好:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4927429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档