java 单例带参数,在Java中使用带参数的单例

I was reading the Singleton article on Wikipedia and I came across this example:

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;

}

}

While I really like the way this Singleton behaves, I can't see how to adapt it to incorporate arguments to the constructor. What is the preferred way to do this in Java? Would I have to do something like this?

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;

}

}

Thanks!

Edit: I think I have started a storm of controversy with my desire to use Singleton. Let me explain my motivation and hopefully someone can suggest a better idea. I am using a grid computing framework to execute tasks in parallel. In general, I have something like this:

// 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).

}

}

What happens is that even though I merely pass a reference to my data to all of the tasks, when the tasks are serialized, the data gets copied over and over. What I want to do is share the object among all of the tasks. Naturally, I might modify the class like so:

// 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).

}

}

As you can see, even here I have the issue that passing a different file path means nothing after the first one is passed. This is why I like the idea for a store which was posted in the answers. Anyhow, rather than including the logic for loading the file in the run method, I wanted to abstract this logic into a Singleton class. I will not provide yet another example, but I hope you get the idea. Please let me hear your ideas for a more elegant way to accomplish what I am trying to do. Thank you again!

解决方案

I'll make my point very clear: a singleton with parameters is not a singleton.

A singleton, by definition, is an object you want to be instantiated no more than once. If you are trying to feed parameters to the constructor, what is the point of the singleton?

You have two options. If you want your singleton to be initialized with some data, you may load it with data after instantiation, like so:

SingletonObj singleton = SingletonObj.getInstance();

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

If the operation your singleton is performing is recurring, and with different parameters every time, you might as well pass the parameters to the main method being executed:

SingletonObj singleton = SingletonObj.getInstance();

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

In any case, instantiation will always be parameter-less. Otherwise your singleton is not a singleton.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值