2010-04-15 17 views
7

¿Qué son los setters y getters? ¿Por qué los necesito? ¿Cuál es un buen ejemplo de ellos en uso de una manera efectiva? ¿Cuál es el punto de un setter y getter?Explícame qué es un setter y getter

Actualización: ¿Puedo obtener algunos ejemplos de codificación, por favor?

+0

Es posible que desee buscar Mutator en wiki: http://en.wikipedia.org/wiki/Mutator_method – Armstrongest

Respuesta

11

Un getter es un método que obtiene el valor de una propiedad. Un colocador es un método que establece el valor de una propiedad. Hay algo de contención sobre su eficacia, pero los puntos son generalmente:

  • para la integridad de encapsulación

  • para mantener una interfaz consistente en caso de que los detalles internos cambian

Más útil es cuando necesita agregar algo de lógica sobre cómo obtener o configurar, como validar un valor antes de escribirlo.

7

Un getter/setter se utiliza para ocultar un campo privado de la publicidad (puede evitar el acceso directo a un campo).

El captador le permite verificar un valor provisto antes de usarlo en su campo interno. El colocador le permite, por ejemplo, aplicar un formato diferente o simplemente restringir el acceso de escritura (por ejemplo, a las clases derivadas).

Una aplicación útil de un getter puede ser algún tipo de carga diferida: el campo de respaldo (el campo privado que está oculto por el getter) se inicializa a nulo. Cuando le pida al getter que devuelva el valor, comprobará nulo y cargará el valor con un método que consuma más tiempo. Esto sucederá solo en la primera llamada, luego el captador proporcionará el valor ya cargado todo el tiempo.

4

Getters & setters interfaz separada (funciones getter/setter) de la implementación (cómo se almacenan realmente los datos).

2

Getters y Setters le permiten controlar cómo se puede acceder o modificar los miembros de un objeto.

En contraste, si expone sus miembros de datos directamente al usuario del objeto, el usuario puede cambiarlos a voluntad, y el objeto ni siquiera sabría que han sido cambiados.

¿No desea que las personas lean un miembro de datos? Haga privado el miembro de datos, y no escriba un getter que devuelva el valor. ¿No quieres que las personas modifiquen un miembro de datos? Haga privado el miembro de datos, y no escriba un setter para él. ¿Quieres controlar el rango de valores permitidos? Pon eso en el colocador.

1

acceso público (getter y setter) a veces tiene sentido. (Me molesta que tengo no sólo para documentar la variable miembro de una clase, sino también los métodos de acceso 2 en su mayoría sin sentido.)

Por lo general no ayuda con la encapsulación, excepto en los casos mencionados por Jason S.

un ejemplo java para algunos carbón cargado desde una base de datos, pero deben estar representados como un valor booleano

char boolFromDb; 

public boolean getBoolFromDb() { 
    return boolFromDb == 'T'; 
} 

public void setBoolFromDb(boolean newValue) { 
    boolFromDb = newValue ? 'T' : 'F'; 
} 
2

una pregunta que podría salir de esto es si el uso de un método en lugar de un campo de acceso directo podría disminuir el rendimiento . La respuesta no es realmente como los compiladores optimizan el código, de modo que si su método solo está haciendo return field;, donde field es el campo de su clase que oculta con el setter/getter, realmente accederá directamente al campo. De este modo, obtiene en la mayoría de los casos el mismo rendimiento, al mismo tiempo que mantiene la opción de cambiar más adelante los métodos set/get.

La efectiva programación en Java de Joshua Block es un gran libro con consejos sobre cómo escribir buenos códigos y explica por qué también. ¿Por qué usar setter/getter es uno de los consejos?

Nota: Es posible que observe que en algunos libros/campos de documentación que presentan un setter/getter en lugar de ser directamente accesibles se les llama 'propiedades' en lugar de campos. P.ej. en C#, incluso puede especificar que un campo es una propiedad y no necesita definir set/get más (buena característica, creo).

Cuestiones relacionadas