2009-03-10 17 views
18

Si tiene una clase con algunas propiedades simples get/set, ¿hay alguna razón para usar getters dentro de los métodos de clase, o debería simplemente usar las variables de miembros privados? Creo que podría haber más de una discusión sobre setters (¿lógica de validación?), Pero me pregunto acerca de getters.Usando captadores dentro de los métodos de clase

Por ejemplo (en Java) - ¿hay alguna razón para utilizar la opción 2 ?:

public class Something 
{ 
    private int messageId; 
    public int getMessageId() { return this.messageId; } 
    public void setMessage(int messageId) { this.messageId = messageId; } 

    public void doSomething() 
    { 
     // Option 1: 
     doSomethingWithMessageId(messageId); 

     // Option 2: 
     doSomethingWithMessageId(getMessageId()); 
    } 
} 
+0

posible duplicado de [¿Cuándo debería una clase usar sus propios getters/setters vs acceder directamente a los miembros?] (Http://stackoverflow.com/questions/586087/when-should-aclase-use-its-own -getters-setters-vs-accessing-the-members-directl) – nawfal

Respuesta

9

Los programadores de Java en general tienden a ser muy consistentes sobre el uso de métodos getter. Programo varios idiomas y no soy tan constante en ello;)

yo diría que todo el tiempo que hace que no hacer un captador que es aceptable utilizar la variable prima - para variables privadas. Cuando haces un getter, deberías usar solo eso. Cuando obtengo un getter para un campo privado, mi IDE sugiere que reemplace automáticamente los accesos de campo sin formato cuando presento un getter. Cambiar a usar un getter está a solo unas pocas teclas de distancia (y sin ninguna posibilidad de introducir errores), por lo que tiendo a retrasarlo hasta que lo necesite.

Por supuesto, si quieres cosas como getter-injection, algunos tipos de proxying y subclassing framworks como hibernate, ¡tienes que usar getters!

+1

¿Cuál es tu IDE? –

+0

¿Hay alguna diferencia en el rendimiento de JRE cuando se usan getters? – Khozzy

7

Con captadores usted no modificar accidentalmente las variables :) Además, si se utilizan los dos captadores y la "prima" variable, su código puede confundirse.

Además, si usa la herencia y redefinió los métodos getter en clases secundarias, los métodos que usan getters funcionarán correctamente, mientras que aquellos que usan las variables raw no funcionarán.

3

Si usa el método getter en todas partes, y en el futuro realice una búsqueda de código en todas las llamadas de getMessageId(), encontrará todas ellas, mientras que si hubiera usado las privadas, puede perder algunas.

Además, si alguna vez hay una lógica para introducir en el método de configuración, no tendrá que preocuparse por cambiar más de 1 ubicación para ello.

1

Si el valor que está asignando a la propiedad es un valor conocido o verificado, puede usar la variable privada de forma segura. (Excepto quizás en algunas situaciones especiales, donde sería obvio por qué sería malo.) Ya sea que lo haga o no, es más una cuestión de gusto o estilo. Tampoco se trata de un problema de rendimiento, ya que el recopilador o el colocador estarán incluidos en el compilador si es lo suficientemente simple.

Si la clase no conoce el valor, debe usar la propiedad para establecerlo, de modo que pueda proteger la propiedad de valores ilegales.

He aquí un ejemplo (en C#):

public class Something { 

    private string _value; 

    public string Value { 
     get { 
     return _value; 
     } 
     set { 
     if (value == null) throw new ArgumentNullException(); 
     _value = value; 
     } 
    } 

    public Something() { 
     // using a known value 
     _value = "undefined"; 
    } 

    public Something(string initValue) { 
     // using an unknown value 
     Value = initValue; 
    } 

} 
0

Si utiliza el captador está asegurando que obtendrá el valor después de cualquier lógica/decisiones se han aplicado a la misma. Probablemente esta no sea su situación típica, pero cuando lo sea, se lo agradecerá por esto.

Cuestiones relacionadas