我认为我写得对,但我不明白哪里有错误。我创建了一个单例类(使用);这个类用于mainactivity (都是我的实现)-hence,这是一个用于循环缓冲区的单例类。上面的类通过调用
RingBuffer.getInstance() 在某种程度上,用户希望更改环形缓冲区的大小,因此我通过调用
RingBuffer.recreateRingBuffer()问:在重新创建了singleton类的实例之后,我希望能够使用新的引用(不同大小的循环缓冲区)自动修改现有的引用。但是不,我仍然有旧的参考资料(旧尺寸的自助餐)。换句话说,在修改引用时,如何使getInstance()的返回值自动修改(因此调用方方法和循环缓冲区正在处理对象的相同副本)
这是我的单身班级
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;
}
}发布于 2015-06-07 05:55:12
您没有为mainactivity或guimanager添加代码,所以这是任何人的猜测。
但是,如果对RingBuffer的引用没有“自动”更新,这可能是因为您将引用存储在一个变量中,如下所示:
RingBuffer rb = RingBuffer.getInstance();然后使用rb变量。
如果要更改引用对象,不要这样做(基本上是在堆上创建一个具有新地址的新对象,所有现有的引用都将保留旧地址)。实例,始终使用getInstance引用它。意义,而不是做
rb.foo();总是这样做:
RingBuffer.getInstance().foo();这样,无论何时您引用RingBuffer的实例,您都将引用真正的单例对象,并且永远不会引用您可能已经创建和丢弃的任何旧实例。
发布于 2015-06-07 05:53:52
在你打电话后
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来更改您想要更改的任何参数,而不只是重新创建它。
https://stackoverflow.com/questions/30690453
复制相似问题