2012-07-06 16 views

Respuesta

12

El objetivo es capturar un valor temporal durante la construcción.

Un ejemplo se da en la solución 53 de Java Puzzlers:

public class MyThing extends Thing { 
    private final int arg; 

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

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

En este caso, queremos capturar y almacenar el parámetro que se desea pasar al constructor de la superclase. Para hacerlo, creamos un constructor auxiliar privado, que nuestro constructor público llama.

+0

¿Es esta una buena idea para capturar el estado del objeto cuando el constructor se ejecuta y no ha terminado de ejecutarse aún? Me refiero a que el objeto podría estar en un estado incoherente? – Inquisitive

+0

Downvoter: ¿Algún comentario? –

+0

@Subhra: No estoy seguro de lo que estás preguntando. ¿Qué objeto podría estar en un estado inconsistente? –

1

Se proporciona una explicación con un ejemplo en Java Concurrency In Practice capítulo 4 sección 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; 
    } 
} 

El constructor privado existe para evitar la condición de carrera que se produciría si el constructor de copia se implementa como este (p.x, p.y).

¿Qué quiere decir es que, si usted no tiene un constructor privado y se implementa constructor de copia en la siguiente forma:

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

Supongamos ahora que el hilo A es tener el acceso a SafePoint p está ejecutando encima copian la instrucción this (px, py) y en el momento desafortunado otro hilo B que también tiene acceso a SafePoint p ejecuta set setter (int x, int y) en el objeto p. Desde su copia constructor está accediendo p 's x y y variable de instancia directamente sin bloqueo adecuado que podría ver estado incoherente de objeto p.

Donde como el constructor privado está accediendo variables p 's x y y través de captador que se sincroniza por lo que están garantizados para ver estado consistente de objeto p.

Cuestiones relacionadas