2010-08-11 10 views
8

No veo ninguna diferencia real entre los dos métodos siguientes de crear un setter, pero me preguntaba si soy ingenuo. ¿Es uno más deseable que el otro?Usando "esto" en setters

public void fooSetter(String bar) 
{ 
    _bar = bar; 
} 


public void fooSetter(String bar) 
{ 
    this._bar = bar; 
} 
+8

sus campos no deberían comenzar con guión bajo. Si bien esto es discutible, puede causar problemas con los marcos que manipulan el pojo. – Bozho

Respuesta

16

no hay diferencia semántica en este caso porque no hay ambigüedad. Si, por el contrario, su campo de instancia fue también llamado bar continuación this sería necesario para eliminar la ambigüedad:

public void fooSetter(String bar) 
{ 
    this.bar = bar; 
} 
+4

Vale la pena decir que el guión bajo en '_bar' no es convencional para variables de miembros privados en Java, generalmente solo' bar'. –

+0

Correcto, _bar no es convencional, pero parece más compacto que m_bar y el significado aún parece ser claro. –

+0

@Noel M: Eso es cierto. Por supuesto, el núcleo API parece encantar los parámetros de una sola letra para los métodos setter, también. =/ –

7

No necesita "esto" ya que no hay ambigüedad. ("bar" y "_bar" son diferentes. Ahora, si su campo también se llamaba "bar", lo necesitaría)

+1

'this' no es para desambiguar, solo para ser explícito para hacer referencia a las variables de esa instancia. Tiendo a usarlo incluso con no hay necesidad de eliminar la ambigüedad –

+0

@Noel: ¿No es suficiente la convención de codificación de subrayado? Odio seriamente las palabras clave 'this' superfluas: P – Thorarin

+0

Underscore es una convención ** no ** en Java –

1

Prefiero la segunda forma, solo porque deja en claro al lector y es consistente ya que es necesario cuando el parámetro y el campo son nombrados de la misma manera (cuando es necesario para diferenciar lo que se está configurando). Sin embargo, no existe una diferencia funcional entre los dos en este ejemplo.

1

this es explícito y por esa razón es preferido por muchos. En algunos casos, la diferencia es significativa, sin embargo. p.ej. una variable miembro y una variable local del mismo nombre.

public void fooSetter(String bar) 
{ 
    String _bar = fancyfilter(bar); 
    this._bar = _bar; 
} 

Un ejemplo un tanto artificial, pero se entiende la idea.

2

Cuando usa setters en Java, this puede ser útil para escapar del alcance variable actual. Si por el contrario tenía

private String bar = ""; 

public void fooSetter(String bar){ 
    this.bar = bar 
} 

que fijaría correctamente la variable de clase en lugar de que la variable de función

1

sus clientes deben ser

setFoo(String foo) 

y

public String getFoo() 

para conformar a las convenciones javabean.

Si el nombre de referencia en el setter (foo) es el mismo que la propiedad de la clase, entonces debe usar 'this' para ser explícito.

1

Como se ha dicho, no es ambiguo, pero prefiero sin usar este también.

Me gustaría ir con algo así que también evita la ambigüedad al dar nombres más explícitos a las variables propósito.

public void setBar(String newBar) 
{ 
    bar = newBar; 
} 

Esta sería mi primera opción, la segunda sería la de utilizar el este, yo no consideraría los guiones bajos.

3

Los diferentes estilos son en su mayoría causados ​​por lo que hizo un programador antes de Java, qué estándares de codificación están presentes en la empresa, etc.

El estilo deseado es utilizar:

public class A { 
      private Type property; 

      public Type getProperty(){ 
       return this.property; 
      } 

      public void setProperty(Type property){ 
       this.property = property; 
      } 
    } 

Esto es un poco el estilo de mejores prácticas y cumple con la norma JavaBeans.

2

¿Es uno más deseable que el otro?

depende del alcance que desea usar-

public class myClass{ 

    private int number=5; 

    private void setNumbers(float number){ 
     number=1; // refers to local variable (float) 
     this.number=2; // refers to class variable (int) 
    } 

} 

me gusta usar "this.variable" cuando me refiero a una variable de clase, se le nota que Eclipse también destacará las variables de clase en azul, donde las variables locales permanecen negras, lo que puede ser útil.