ウィキペディアのシングルトンの記事を読んでいて、この例に出くわしました。
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;
}
}
ありがとう!
編集:シングルトンを使用したいという思いから、私は論争の嵐を巻き起こしたと思います。私の動機を説明しましょう。うまくいけば、誰かがより良いアイデアを提案してくれるでしょう。グリッドコンピューティングフレームワークを使用して、タスクを並列で実行しています。一般的に、私はこのようなものを持っています:
// 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メソッドにファイルを読み込むためのロジックを含めるのではなく、このロジックをシングルトンクラスに抽象化したかったのです。さらに別の例を提供することはしませんが、あなたがそのアイデアを理解してくれることを願っています。私がやろうとしていることを達成するためのよりエレガントな方法についてのアイデアを聞かせてください。ありがとうございました!