Я читал статью Синглтона в Википедии, и я наткнулся на этот пример:
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;
}
}
Спасибо!
Изменить: Я думаю, что я начал бурю споров с моим желанием использовать Синглтон. Позвольте мне объяснить мою мотивацию и, надеюсь, кто-то может предложить лучшую идею. Я использую grid grid framework для выполнения задач параллельно. В общем, у меня есть что-то вроде этого:
// 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. Я не буду приводить еще один пример, но я надеюсь, что вы поймете эту идею. Пожалуйста, позвольте мне услышать ваши идеи для более элегантного способа выполнить то, что я пытаюсь сделать. Еще раз спасибо!