我在维基百科上阅读了“单例模式”文章,发现了这个例子:
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;
}
}
虽然我非常喜欢这个单例模式的行为方式,但我不知道如何将构造函数参数集成进去。在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;
}
}
谢谢!
编辑:我认为我的愿望使用 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).
}
}
正如你所看到的,即使在这里,我也面临着传递不同文件路径后什么都不起作用的问题。 这就是为什么我喜欢答案中发布的store(存储)的想法。 无论如何,我希望将加载文件的逻辑抽象成一个 Singleton 类,而不是在运行方法中包含该逻辑。 我不会提供另一个示例,但我希望你能理解我的想法。 请告诉我你更优雅的实现方法。 再次感谢!