나는 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;
}
}
이 싱글 톤의 동작 방식이 정말 마음에 들지만, 생성자에 인수를 통합하도록 조정하는 방법을 볼 수 없습니다. 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 클래스로 추상화하고 싶었습니다. 나는 또 다른 예를 제공하지는 않지만 아이디어를 얻길 바랍니다. 내가하려는 일을 더 우아하게 수행 할 수있는 방법에 대한 귀하의 아이디어를 들려주세요. 다시 감사합니다!