Java中带有参数的Singleton

我正在阅读Wikipedia上的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;

}

}

谢谢!

编辑:我想我对使用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类。我不会再提供另一个示例,但是希望你能理解。请让我听听你的想法,以更优雅的方式完成我要尝试的工作。再次感谢你!

回答:

我会很清楚地指出:具有参数的单例不是单例。

根据定义,单例是你希望被实例化的对象不超过一次。如果试图将参数提供给构造函数,那么单例的意义是什么?

你有两个选择。如果你希望用一些数据初始化单例,则可以在实例化后用数据加载它,如下所示:

SingletonObj singleton = SingletonObj.getInstance();

singleton.init(paramA, paramB); // init the object with data

如果你的单例正在执行的操作是重复发生的,并且每次都使用不同的参数,则最好将这些参数传递给正在执行的main方法:

SingletonObj singleton = SingletonObj.getInstance();

singleton.doSomething(paramA, paramB); // pass parameters on execution

无论如何,实例化总是没有参数的。否则,你的单身人士将不是单身人士。

以上是 Java中带有参数的Singleton 的全部内容, 来源链接: utcz.com/qa/429838.html

回到顶部