2012-07-06 16 views

risposta

12

L'obiettivo è quello di acquisire un valore temporaneo durante la costruzione.

Un esempio è dato in Solution 53 Java Puzzlers:

public class MyThing extends Thing { 
    private final int arg; 

    public MyThing() { 
     this(SomeOtherClass.func()); 
    } 

    private MyThing(int i) { 
     super(i); 
     arg = i; 
    } 
} 

In questo caso, vogliamo catturare e memorizzare il parametro che vogliamo passare al costruttore della superclasse. Per fare ciò, creiamo un costruttore di helper privato, che il nostro costruttore pubblico chiama.

+0

Questa è una buona idea per acquisire lo stato dell'oggetto quando il costruttore è in esecuzione e non ha ancora completato l'esecuzione? Voglio dire che l'oggetto potrebbe trovarsi in uno stato incoerente? – Inquisitive

+0

Downvoter: eventuali commenti? –

+0

@ Subhra: non sono sicuro di cosa stai chiedendo. Quale oggetto potrebbe essere in uno stato incoerente? –

1

Una spiegazione viene fornita con un esempio in Java Concurrency In Practice capitolo 4 sezione 4.3.5.

public class SafePoint { 
    private int x, y; 

    private SafePoint(int[] a) { 
     this(a[0], a[1]); 
    } 

    public SafePoint(SafePoint p) { 
     this(p.get()); 
    } 

    public SafePoint(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public synchronized int[] get() { 
     return new int[] { x, y }; 
    } 

    public synchronized void set(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

Il costruttore privato esiste per evitare la condizione di competizione che si verificherebbe se il costruttore di copia sono state attuate come questo (p.x, p.y).

Che cosa vuol dire è, se non si dispone di un costruttore privato e di implementare costruttore di copia in modo seguente:

public SafePoint(SafePoint p) { 
    this(p.x, p.y); 
} 

Ora supponiamo che il thread A sta avendo l'accesso ai safepoint p è l'esecuzione sopra il costruttore della copia, questa istruzione (px, py) e allo sfortunato tempo un altro thread B che ha anche accesso a SafePoint p esegue setter set (int x, int y) sull'oggetto p. Dal momento che il costruttore di copie accede s' px e y variabile istanza direttamente senza adeguato bloccaggio potrebbe vedere stato incoerente dell'oggetto p.

Dove come il costruttore privato sta accedendo variabili s' px e y attraverso getter che è sincronizzato in modo che siano garantiti per vedere stato coerente dell'oggetto p.

Problemi correlati