[英]how can I recreate singleton class in java
我以为我写的没错,但是我不去注意错误所在。 我创建一个单例类(使用apache commons的ringbuffer); 这用于mainactivity和guimanager(均为我的实现)中,因此是用于ringbuffer的单例类。 上面的类通过调用获取单例的引用
RingBuffer.getInstance()
在某些时候,用户想更改环形缓冲区的大小,因此我通过调用来重新创建单例类
RingBuffer.recreateRingBuffer()
问题:重新创建单例类的实例后,我希望mainactivity和guimanager中的现有引用将被新的引用(具有不同大小的环形缓冲区)自动修改。 但是不,我仍然有旧的引用(具有旧大小的buffere)。 换句话说,无论何时修改引用,如何使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;
}
}
您没有添加用于mainactivity
或guimanager
的代码,所以这是任何人的猜测。
但是,如果对RingBuffer
的引用未“自动”更新,则可能是因为您将引用存储在变量中,如下所示:
RingBuffer rb = RingBuffer.getInstance();
然后使用rb
变量。
如果要更改引用对象,请不要这样做(基本上是在堆上使用新地址创建一个新对象,所有现有引用仍将保留旧地址)。 实例,请始终使用getInstance
引用它。 含义,而不是做
rb.foo();
总是做:
RingBuffer.getInstance().foo();
这样,无论何时引用RingBuffer
的实例,您都将引用真正的单例对象,而永远不会引用您可能创建和丢弃的任何旧实例。
致电后
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,否则不会进行GC处理。
当您提供重新创建的准备时,您就无法达到目的。 最好提供一个setter来更改您想更改的任何参数,而不仅仅是重新创建它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.