[英]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.