簡體   English   中英

如何在Java中重新創建單例類

[英]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;
 }
}

您沒有添加用於mainactivityguimanager的代碼,所以這是任何人的猜測。

但是,如果對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM