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

时间:2015-06-07 05:49:35

标签: java android singleton

我以为我写的是对的,但是我不会跟随错误的地方。 我创建了一个单例类(使用apache commons的ringbuffer);这是在mainactivity和guimanager中使用的(两者都是我的实现) - 因为是ringbuffer的单例类。上面的类通过调用

获得单例的引用
    RingBuffer.getInstance() 

在某些时候,用户想要更改环形缓冲区的大小,所以我通过调用

来重新创建单例类
   RingBuffer.recreateRingBuffer()

问题:在重新创建单例类的实例之后,我希望使用新引用(具有不同大小的ringbuffer)自动修改mainactivity和guimanager中的现有引用。但不,我仍然有旧的参考(旧尺寸的buffere)。换句话说,如何在修改引用的任何时候自动修改getInstance()的返回值(因此调用方法和ringbuffer正在处理对象的同一副本)

这是我的单身人士课程

 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;
 }
}

2 个答案:

答案 0 :(得分:1)

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

但是,如果RingBuffer的引用未“自动”更新,则可能是因为您将引用存储在变量中,如下所示:

RingBuffer rb = RingBuffer.getInstance();

然后使用rb变量。

如果您要更改引用对象,则不要这样做(您基本上是在堆上使用新地址创建新对象,所有现有引用仍将保留老地址)。实例,始终使用getInstance引用它。意思是,而不是做

rb.foo();

总是这样做:

RingBuffer.getInstance().foo();

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

答案 1 :(得分:0)

致电后

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来改变你想要改变的参数,而不仅仅是重新创建它。