我在维基百科上读到一篇关于 Singleton 的文章,发现了这样的例子:
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() {}
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
虽然我非常喜欢 Singleton 的行为方式,但是我不知道如何调整它以便将参数合并到构造函数中。在 Java 中这样做的首选方法是什么?我有必要这么做吗?
public class Singleton
{
private static Singleton singleton = null;
private final int x;
private Singleton(int x) {
this.x = x;
}
public synchronized static Singleton getInstance(int x) {
if(singleton == null) singleton = new Singleton(x);
return singleton;
}
}
谢谢!
编辑: 我想我已经开始与我的愿望使用单例风暴的争议。让我解释一下我的动机,希望有人能提出一个更好的主意。我使用网格计算框架并行执行任务。一般来说,我有这样的东西:
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private final ReferenceToReallyBigObject object;
public Task(ReferenceToReallyBigObject object)
{
this.object = object;
}
public void run()
{
// Do some stuff with the object (which is immutable).
}
}
发生的情况是,即使我只是将对数据的引用传递给所有任务,当任务被序列化时,数据也会被一遍又一遍地复制。我想要做的是在所有任务之间共享对象。当然,我可以这样修改类:
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private static ReferenceToReallyBigObject object = null;
private final String filePath;
public Task(String filePath)
{
this.filePath = filePath;
}
public void run()
{
synchronized(this)
{
if(object == null)
{
ObjectReader reader = new ObjectReader(filePath);
object = reader.read();
}
}
// Do some stuff with the object (which is immutable).
}
}
正如您所看到的,即使在这里,我也存在这样的问题: 传递不同的文件路径在传递第一个文件路径之后没有任何意义。这就是为什么我喜欢 商店的想法,这是张贴在答案。无论如何,我不想在 run 方法中包含加载文件的逻辑,而是想将这个逻辑抽象为一个 Singleton 类。我不会再提供另一个例子了,但我希望你们能明白我的意思。请让我听听你的想法,一个更优雅的方式来完成我正在努力做的事情。再次感谢!