首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中重新创建单例类?

如何在java中重新创建单例类?
EN

Stack Overflow用户
提问于 2015-06-07 05:49:35
回答 2查看 847关注 0票数 0

我认为我写得对,但我不明白哪里有错误。我创建了一个单例类(使用);这个类用于mainactivity (都是我的实现)-hence,这是一个用于循环缓冲区的单例类。上面的类通过调用

代码语言:javascript
复制
    RingBuffer.getInstance() 

在某种程度上,用户希望更改环形缓冲区的大小,因此我通过调用

代码语言:javascript
复制
   RingBuffer.recreateRingBuffer()

问:在重新创建了singleton类的实例之后,我希望能够使用新的引用(不同大小的循环缓冲区)自动修改现有的引用。但是不,我仍然有旧的参考资料(旧尺寸的自助餐)。换句话说,在修改引用时,如何使getInstance()的返回值自动修改(因此调用方方法和循环缓冲区正在处理对象的相同副本)

这是我的单身班级

代码语言:javascript
复制
 import java.util.Arrays;
 import org.apache.commons.collections.buffer.CircularFifoBuffer;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.math3.stat.StatUtils;
 import android.util.Log;

 public class RingBuffer {
    private CircularFifoBuffer buffer;
    private int size;
    private volatile static  /*final*/ RingBuffer instance = new RingBuffer(7);

private RingBuffer(int n) {
    size = n;
    buffer = new CircularFifoBuffer(size);
}

public static RingBuffer getInstance() {
    return instance;
}

public static RingBuffer recreateRingBuffer(int n) {
    Log.e(Constants.GLOBALTAG,"Recreating RingBuffer of Size "+n);
    instance=null;
    instance=new RingBuffer(n);
    return instance;
 }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-07 05:55:12

您没有为mainactivityguimanager添加代码,所以这是任何人的猜测。

但是,如果对RingBuffer的引用没有“自动”更新,这可能是因为您将引用存储在一个变量中,如下所示:

代码语言:javascript
复制
RingBuffer rb = RingBuffer.getInstance();

然后使用rb变量。

如果要更改引用对象,不要这样做(基本上是在堆上创建一个具有新地址的新对象,所有现有的引用都将保留旧地址)。实例,始终使用getInstance引用它。意义,而不是做

代码语言:javascript
复制
rb.foo();

总是这样做:

代码语言:javascript
复制
RingBuffer.getInstance().foo();

这样,无论何时您引用RingBuffer的实例,您都将引用真正的单例对象,并且永远不会引用您可能已经创建和丢弃的任何旧实例。

票数 1
EN

Stack Overflow用户

发布于 2015-06-07 05:53:52

在你打电话后

代码语言:javascript
复制
public static RingBuffer recreateRingBuffer(int n) {
    Log.e(Constants.GLOBALTAG,"Recreating RingBuffer of Size "+n);
    instance=null;
    instance=new RingBuffer(n);
    return instance;
 }

你确实有两个对象。您只是将旧对象的引用设置为null,并创建一个新对象。然后设置这个新对象的旧引用。但是旧对象的引用仍然在代码中的某个地方使用。除非所有引用都为null,否则不会是GCed。

当你提供重新创造的规定时,你就是在挫败单身人士的目的。最好提供一个setter来更改您想要更改的任何参数,而不只是重新创建它。

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

https://stackoverflow.com/questions/30690453

复制
相关文章

相似问题

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