繁体   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