Java 带参数的单例

Java 带参数的单例,java,parameters,singleton,Java,Parameters,Singleton,我已经编写了一个单例,但是这个单例需要一个上下文作为参数来初始化自己。由于上下文在其构造函数中只使用一次,因此我不想将其添加到getInstance(上下文)中。经过深思熟虑,我得出了以下答案: public class Singleton { private static Context sContext; public static void init(Context context) { sContext = context; } pub

我已经编写了一个单例,但是这个单例需要一个上下文作为参数来初始化自己。由于上下文在其构造函数中只使用一次,因此我不想将其添加到getInstance(上下文)中。经过深思熟虑,我得出了以下答案:

public class Singleton {
    private static Context sContext;

    public static void init(Context context) {
        sContext = context;
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        private static Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
        if (sContext == null) {
            throw new IllegalArgumentException("#init should be called in Application#onCreate");
        }
        // Initialize the Singleton.
        // .....
        // After the constructed, remove the sContext.
        sContext = null;
    }
}
这很好,在Android/applicationon#onCreate方法中调用了类方法init。 它不是SingletonHolder.instance实例,因为它没有加载。 有人能给我一些建议吗?谢谢

在@WarrenFaith的帮助下,我更改了代码

 public class Singleton {

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        private static Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
        final Context context = BaseApplication.getApplication();
        // Initialize the Singleton.
        // .....
    }
}

public class BaseApplication extends Application {

    private static Application sApplication;

    public static Application getApplication() {
        return sApplication;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sApplication = this;
    }
}

为什么不使用更简单的解决方案:

public class Singleton {
    private final static Singleton mInstance = new Singleton();
    private final static Context sContext;

    private Singleton() {
        sContext = MyApplication.getInstance();
        // do more
    }

    public static Singleton getInstance() {
        return mInstance;
    }
}
这是一个很好的防弹单体模式

当然,您需要将应用程序类实现为单例,但根据定义,它已经是单例了

public class MyApplication extends Application {
    private static MyApplication mInstance;

    @Override
    protected void onCreate() {
        super.onCreate();
        mInstance = this;
        // create your Singleton!
        Singleton.getInstance();
    }

    public static MyApplication getInstance() {
        return mInstance;
    }
}

是的,我知道你的解决办法。我不喜欢在调用Singleton静态util方法时加载Singleton。因此,我需要推送Singleton实例,直到第一次调用getInstance或SingltonHolder.instance。我们知道MyApplication.getInstance()应该在#onCreate中设置一个静态实例对象。他们的工作方式相同。应用程序静态实例有很多缺陷。我不明白你的问题。在应用程序的onCreate中不需要调用singleton.getInstance。那只是一个样本。您只需确保在设置应用程序的minInstance之后调用它。其余的工作完美无瑕。你所说的“应用程序静态实例的缺陷”是什么意思?首先,之前我不太确定应用程序是否为单例。我将在获得15个声誉后再做-_-|||