Singleton mit Argumenten in Java

Las ich die Singleton-Artikel auf Wikipedia und stieß ich auf dieses Beispiel:

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;
    }
}

Während ich mag wirklich die Art wie das Singleton verhält, kann ich nicht sehen, wie sich anzupassen, zu integrieren, die Argumente an den Konstruktor übergeben. Was ist der bevorzugte Weg, um dies in Java? Würde ich so etwas tun?

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;
    }
}

Dank!


Edit: ich denke ich habe angefangen, einen Sturm der Kontroverse mit meinem Wunsch, Singleton. Lassen Sie mich erklären, meine motivation und ich hoffe jemand kann deuten auf eine bessere Idee. Ich bin mit einem grid-computing-framework zur Ausführung von Aufgaben parallel. Im Allgemeinen, ich habe so etwas wie dieses:

//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).
    }
}

Was passiert, ist, dass, obwohl ich lediglich übergeben Sie einen Verweis, um meine Daten zu allen Aufgaben, wenn die Aufgaben serialisiert die Daten, kopiert wird immer und immer wieder. Was ich will zu tun ist, teilen sich das Objekt unter all den Aufgaben. Natürlich könnte ich die Klasse ändern, und zwar so:

//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).
    }
}

Wie Sie sehen können, auch hier habe ich das Problem, dass man einen anderen Datei-Pfad bedeutet, dass nichts nach das erste ist vergangen. Das ist, warum ich mag die Idee für ein storedie veröffentlicht wurde in den Antworten. Jedenfalls, als auch die Logik für das laden der Datei in der run-Methode, ich wollte diese abstrakte Logik in einer Singleton-Klasse. Ich werde nicht bieten noch ein weiteres Beispiel, aber ich hoffe, Sie bekommen die Idee. Bitte lassen Sie mich hören Ihren Ideen für eine elegantere Möglichkeit das zu erreichen, was ich zu tun versuche. Danke nochmals!

InformationsquelleAutor der Frage | 2009-06-26

Schreibe einen Kommentar