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