Singleton z argumentami w Javie

Czytałem artykuł Singletona na Wikipedii i natknąłem się na ten przykład:

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

Chociaż naprawdę podoba mi się sposób, w jaki zachowuje się ten Singleton, nie widzę, jak go dostosować, aby zawierał argumenty konstruktora. Jaki jest preferowany sposób wykonywania tego w Javie? Czy musiałbym zrobić coś takiego?

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

Dzięki!

Edytuj: Myślę, że zacząłem burzę kontrowersji z moim pragnieniem korzystania z Singleton. Pozwól mi wyjaśnić moją motywację i mam nadzieję, że ktoś może zasugerować lepszy pomysł. Używam szkieletu obliczeniowego grid do wykonywania zadań równolegle. Ogólnie mam coś takiego:

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

Zdarza się, że mimo że przekazuję jedynie referencje do moich danych do wszystkich zadań, kiedy zadania są serializowane, dane są kopiowane w kółko. Chcę udostępnić obiekt wszystkim zadaniom. Oczywiście mogę zmodyfikować klasę tak:

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

Jak widać, nawet tutaj mam problem, że przekazanie innej ścieżki pliku nic nie znaczy po przekazaniu pierwszej. Dlatego podoba mi się pomysł nasklep który został zamieszczony w odpowiedziach. W każdym razie, zamiast włączać logikę do ładowania pliku w metodzie run, chciałem przekształcić tę logikę w klasę Singleton. Nie przedstawię kolejnego przykładu, ale mam nadzieję, że wpadniesz na pomysł. Pozwól mi usłyszeć twoje pomysły, aby uzyskać bardziej elegancki sposób na osiągnięcie tego, co próbuję zrobić. Jeszcze raz dziękuję!