我以为我写的是对的,但是我不会跟随错误的地方。 我创建了一个单例类(使用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;
}
}
答案 0 :(得分:1)
您没有添加mainactivity
或guimanager
的代码,所以这是任何人的猜测。
但是,如果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来改变你想要改变的参数,而不仅仅是重新创建它。