Я читав статтю Сінглтона у Вікіпедії і натрапив на такий приклад:
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).
}
}
Як бачите, навіть тут у мене виникає проблема, що проходження іншого шляху до файлу нічого не означає після проходження першого. Ось чому мені подобається ідея про магазин, який розмістили у відповідях. У всякому разі, замість того, щоб включати логіку для завантаження файлу методом запуску, я хотів абстрагувати цю логіку класом Singleton. Я не приведу ще одного прикладу, але сподіваюся, що ви зрозумієте цю ідею. Будь ласка, дозвольте мені почути ваші ідеї для більш елегантного способу виконання того, що я намагаюся зробити. Ще раз дякую вам!