2012-08-09 17 views
9

posible duplicado:
Why use getters and setters?La necesidad de métodos getter

Ésta es una pregunta novato. ¿Es muy necesario utilizar getmethods para acceder a los valores de las propiedades? Una vez que se ha asignado el valor, uno puede obtener el directorio de valores. Por ejemplo, en el siguiente código, displayName() puede mostrar el valor de firstName sin la ayuda de ningún método getter. ¿O es un estándar de codificación estándar que uno debe tener el método getter y setter o cualquier otro método que dé ese valor?

class Test{ 

    private String firstName; 

    public void setName(String fname){ 
     firstName = fname; 
    } 

    public void displayName() { 
     System.out.println("Your name is " + firstName); 
    } 
}   

Respuesta

12

Tell, Don't Ask es un principio importante en el diseño orientado a objetos. En general, debe decirle a los objetos que hagan cosas en lugar de hacerles preguntas. los getters/setters en todas partes desalientan esta práctica porque se les anima a alcanzar dentro de un objeto y llegar a los campos (o incluso peor a tocar y meter cosas en el caso de los setters). Esto rompe la encapsulación y hace que su código sea más difícil de razonar.

En su caso particular, crearía un objeto llamado Name que tiene un constructor que toma el nombre y el método único para mostrarlo.

2

¡Utilice siempre Getter and Setter para acceder a sus propiedades!

Usted debe echar un vistazo a this article...

+3

incluso en los casos de paquetes de clases privadas y clases anidadas? – Eugene

+3

¿Esto también se aplica si desea acceder al campo desde dentro de la clase (como lo es en este ejemplo)? No lo creo ... El artículo solo habla sobre el acceso externo y el uso alternativo de los campos públicos (que acepto debería reducirse al mínimo). – brimborium

4

En su caso (para visualizar el nombre de visualización) que no es necesario recurrir a proporcionar Getter.

Pero si quieres utilizar el campo en otra clase, tenemos que proporcionar el método Getter.

3

Getter y setters son una parte de la interfaz estándar para Java Beans y muchos frameworks como Hibernate los esperan en su lugar. Dicho esto, por supuesto depende de usted decidir cuándo y cuándo los necesita y con qué fin. Proporcionan acceso a las variables de miembros privados e incluso pueden darle la oportunidad de hacer más que solo obtener y establecer.

El objetivo del software OO es la reutilización. Esto significa que otros programadores, o dentro de unos años, pueden usar el código para otros sistemas.

Cuando tiene variables miembro privadas y usa las funciones get/set, puede cambiar la implementación interna de la función sin romper el resto del código que la usa.

2

Tener estado privado, la encapsulación es buena, y en MUCHOS casos esto es lo correcto. Supongamos que su clase se supone que es Thread Safe, que tiene campos públicos que no puede asegurar.

Por otro lado, hay casos en que esto es inútil. Supongamos que accede a su objeto solo en un paquete, está seguro de que nunca lo exportará, entonces ¿para qué molestarse?

+1

bastante seguro que puedes con la palabra clave 'volátil'. – Woot4Moo

+2

@ Woot4Moo lo único que va a garantizar con la visibilidad es volátil, que no es suficiente para seguridad de subprocesos – Eugene

+1

esto parece estar en desacuerdo: http://stackoverflow.com/questions/7805192/is-a-volatile-int-in -java-thread-safe – Woot4Moo

2

No tengo ningún enlace para admitir esto, pero es lo que hago.

Intento evitar los campos públicos si no son estáticos. Así que solo uso campos protegidos y privados. Desde dentro de la clase, puedes acceder a ellos sin obtener/configurar, eso está completamente bien. Desde fuera de la clase, siempre intente usar get/set.

Así que su código de ejemplo está completamente bien para mí. :)

EDIT: Una excepción es para mí si puedo crear una estructura clase de contenedor -como gusta este

class Point4D { 
    public int x1, x2, x3, x4; 
} 

Entonces creo que los campos públicos están bien. Sin embargo, sería mejor hacerlos privados y nombrar los getters public int x1() etc. Tan pronto como se introducen algunos métodos en este contenedor que cambian el estado de la instancia (como cambiar los valores de x1/x2/x3/x4), los hago privados y agrego get/set.

Cuestiones relacionadas