ウィキペディアでシングルトンの記事を読んでいたところ、次の例に出くわしました。
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 クラスに抽象化したかったのです。これ以上例を挙げることはしませんが、理解していただければ幸いです。私がやろうとしていることを達成するためのよりエレガントな方法について、あなたのアイデアを聞かせてください。ありがとうございました!