2011-12-14 9 views
15

A menudo veo constructores como esteUsando métodos setter en constructor: ¿mala práctica?

public class A { 

    private int b; 

    public A(int b) { 
     setB(b); 
    } 

    public void setB(int b) { 
     this.b = b; 
    } 
} 

¿Es esta una buena idea? ¿Debería usar métodos setter en el constructor? ¿No es un problema si anulo los métodos constructor o setter en una subclase?

+0

constructor de uso exclusivo para iniciar variable. no es una buena idea llamar a ningún método a través del constructor. – Ashish

Respuesta

28

Probablemente no una buena idea. Si no hace que la clase sea definitiva y no haga que el método setName (...) sea privado o final, otra persona podrá ampliar su clase y anular el método setName (...). Su constructor (en su clase base) llamará a ese método en la clase extendida en lugar de su implementación. Nadie sabe qué puede hacer ese método. Como regla general, un constructor no debe llamar a los métodos que pueden ser anulados.

+7

No es solo eso: en la llamada de 'setName()', el constructor de la subclase aún no ha sido llamado, por lo que las variables finales pueden ser sin inicializar, etc. – artbristol

2

Creo que debe elegir cuidadosamente y tener en cuenta las desventajas de cada uno.

Si la clase que está definiendo es probable que sea subclasificada, tenga especial cuidado para evitar ser inicializada en un momento en que la subclase necesita que se complete.

Esto puede ser un mecanismo útil pero, en mi opinión, desagradable.

public class A { 

    private int b; 

    public A(int b) { 
     _setB(b); 
    } 

    private void _setB(int b) { 
     this.b = b; 
    } 

    public void setB(int b) { 
     _setB(b); 
    } 
} 

Yo personalmente preferiría que a pesar de que algo como esto:

public class A { 

    private int b; 

    public A(int b) { 
     this.b = b; 
    } 

    public void setB(int b) { 
     this.b = b; 
    } 
} 
+0

Pero, si tiene que verificar el parámetro [b] antes de usar es posible que tengas un código redundante !! –

Cuestiones relacionadas