首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - Singleton

Java - Singleton
EN

Stack Overflow用户
提问于 2015-05-07 12:40:21
回答 5查看 486关注 0票数 4

关于在Java中实现Singleton模式,我有一些问题。

  1. 当我们使用克隆时,有可能拥有多个Singleton实例。有什么具体的方法可以防止吗?
  2. 如果我们使用序列化和反序列化创建另一个单例实例,会产生什么影响?
EN

回答 5

Stack Overflow用户

发布于 2015-05-07 12:45:44

( 1)不要使Singleton克隆,也没有人会克隆它

2)如果Singleton是Serialiazable的,并且它不使用readResolve来防止重复,那么在反序列化它时就会得到副本,并且它不再是Singleton了。影响取决于应用程序逻辑。

票数 2
EN

Stack Overflow用户

发布于 2015-05-07 12:53:23

有效的Java项目3: Elvis是您的类。

代码语言:javascript
复制
public class Elvis {
  private static final Elvis INSTANCE = new Elvis();
  private Elvis() { ... }
  public static Elvis getInstance() { return INSTANCE; }
  public void leaveTheBuilding() { ... }
}

如果您想序列化它:

代码语言:javascript
复制
// 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;
}

或者你可以用枚举:

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

Stack Overflow用户

发布于 2015-05-07 12:47:11

我不确定你的第二点,但这回答了第一点:

代码语言:javascript
复制
public class SingletonObject {

    /**
     * The one and only instance of this class
     */
    private static SingletonObject ref;

    /**
     * Creates the object. Must not be called more than once.
     */
    private SingletonObject() {
        // no code required
    }

    /**
     * Returns a reference to the singleton object
     * @returns The singleton object
     */
    public static synchronized SingletonObject getSingletonObject() {
        if (ref == null) {
            // First call, so create it
            ref = new SingletonObject();
        }
        return ref;
    }

    /**
     * Prevents cloning of the object.
     * @throws CloneNotSupportedException If method is called
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
}

您可以简单地重写克隆方法。请注意,getSingletonObject是同步的,如果ref等于null,两个线程同时调用函数,这将阻止创建对象的实例。

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

https://stackoverflow.com/questions/30101354

复制
相关文章

相似问题

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