@ yegor256 Entiendo tu analogía del perro y la pelota e incluso la apoyo, pero ¿qué pasa cuando un objeto de "organismo vivo" almacena el valor primitivo ocasional, por ejemplo, una identificación? ¿Qué sucede si desea ir un paso más allá de una simple asignación, pero no desea escribir una nueva clase solo para manejar valores primitivos?
Jacksonkr
Respuestas:
127
Realmente no se requiere tutorial para esto. Leer sobre encapsulación
privateString myField;//"private" means access to this is restrictedpublicString getMyField(){//include validation, logic, logging or whatever you like herereturnthis.myField;}publicvoid setMyField(String value){//include more logicthis.myField = value;}
entonces getter es solo un método para obtener un campo privado y setter está configurando un nuevo campo. gracias por la excelente explicación por código
ajsie
1
¿podría pasar un parámetro a un captador?
ajsie
2
noname: No y no. Getter es una forma de obtener un valor pero NO exponer el valor contenido en un campo, es decir, si lo llamas someObj.getTime().setHour(5)no debería afectar someObjel estado interno. También los setters y getters (accesores y mutadores por su nombre más elegante) tienen una firma de método muy estricta, lo que significa que getter no tiene ningún parámetro. Los métodos en general solo deberían hacer una cosa de todos modos.
Esko
4
@noname: Cuando a cosas simples se les dan nombres complejos / grandes / abstractos, tienes lo que se llama un "patrón de diseño" ... Y este es un ejemplo del Patrón de Explicación de Concepto Recursivo que acabo de inventar ;-)
namespaceform
3
@qed: la thispalabra clave es opcional a menos que haya un conflicto con algo que tenga un alcance más específico. En el ejemplo que dio, el definidor que se crea tendrá un solo parámetro cuyo nombre coincide con el nombre del campo, por lo tanto this.fieldName = fieldName, se usa para distinguir que se está asignando el campo en lugar del parámetro que se asigna a sí mismo como fieldName = fieldnamese lograría. No existe tal conflicto en el captador.
Paul Creasey
39
En Java, los getters y setters son funciones completamente ordinarias. Lo único que los convierte en getters o setters es la convención. Un getter para foo se llama getFoo y el setter se llama setFoo. En el caso de un booleano, el getter se llama isFoo. También deben tener una declaración específica como se muestra en este ejemplo de un getter y setter para 'name':
La razón para usar getters y setters en lugar de hacer públicos a sus miembros es que permite cambiar la implementación sin cambiar la interfaz. Además, muchas herramientas y conjuntos de herramientas que utilizan la reflexión para examinar objetos solo aceptan objetos que tienen captadores y definidores. Los JavaBeans, por ejemplo, deben tener getters y setters, así como algunos otros requisitos.
El vacío es realmente necesario aquí. Si no lo tiene, obtiene:error: invalid method declaration; return type required
Dan
3
No se requiere vacío aquí
Shashi Kiran
2
@JasonHartley: un constructor no tiene un tipo de retorno.
wassimans
@Mark Byers Entonces, el constructor se usa para inicializar la instancia y el establecedor se usa para cambiar cualquier atributo dado. ¿Es esto correcto?
carloswm85
12
classClock{String time;void setTime (String t){
time = t;}String getTime(){return time;}}classClockTestDrive{publicstaticvoid main (String[] args){Clock c =newClock;
c.setTime("12345")String tod = c.getTime();System.out.println(time:"+ tod);}}
Cuando ejecuta el programa, el programa se inicia en la red,
se crea el objeto c
la función setTime()es llamada por el objeto c
la variable timese establece en el valor pasado por
Aunque los métodos getter / setter son comunes en Java, no están particularmente orientados a objetos (OO). De hecho, pueden dañar la capacidad de mantenimiento de su código. Además, la presencia de numerosos métodos getter y setter es una señal de alerta de que el programa no está necesariamente bien diseñado desde una perspectiva OO.
Este artículo explica por qué no debería usar getters y setters (y cuándo puede usarlos) y sugiere una metodología de diseño que lo ayudará a romper con la mentalidad de getter / setter.
1. Los mejores getters / setters son inteligentes.
Aquí hay un ejemplo de javascript de mozilla:
var o ={ a:0}// `o` is now a basic objectObject.defineProperty(o,"b",{
get: function (){returnthis.a +1;}});
console.log(o.b)// Runs the getter, which yields a + 1 (which is 1)
Los he usado MUCHO porque son increíbles . Lo usaría cuando me pusiera elegante con mi codificación + animación. Por ejemplo, cree un establecedor que se ocupe de un Numberque muestre ese número en su página web. Cuando se usa el establecedor, anima el número antiguo al nuevo número usando un tweener . Si el número inicial es 0 y lo establece en 10, verá que los números pasan rápidamente de 0 a 10, digamos, medio segundo. A los usuarios les encantan estas cosas y es divertido de crear.
2. Getters / setters en php
Ejemplo de sof
<?php
classMyClass{private $firstField;private $secondField;public function __get($property){if(property_exists($this, $property)){return $this->$property;}}public function __set($property, $value){if(property_exists($this, $property)){
$this->$property = $value;}return $this;}}?>
Aquí hay un ejemplo para explicar la forma más sencilla de usar getter y setter en java. Se puede hacer esto de una manera más sencilla, pero getter y setter tienen algo especial que es cuando se usa un miembro privado de la clase principal en la clase secundaria en herencia. Puede hacerlo posible mediante el uso de getter y setter.
package stackoverflow;publicclassStackoverFlow{privateint x;publicint getX(){return x;}publicint setX(int x){returnthis.x = x;}publicvoid showX(){System.out.println("value of x "+x);}publicstaticvoid main(String[] args){StackoverFlow sto =newStackoverFlow();
sto.setX(10);
sto.getX();
sto.showX();}}
No voy a rechazarlo (no vale la pena el esfuerzo). Tenga en cuenta que (1) ha respondido a una pregunta de Java , donde el lenguaje del programa debería estar en Java. (2) Si desea publicar, asegúrese de que el diseño se realice correctamente. (3) Su uso de encapsulación (captador (o descriptor de acceso) y definidores (o mutadores)) es incorrecto. Por favor, busque lo que significa la encapsulación ... (marque la respuesta votada)
KarelG
1
@KarelG lo siento, no leí las etiquetas. lo actualicé a java. gracias por darme cuenta.
Respuestas:
Realmente no se requiere tutorial para esto. Leer sobre encapsulación
fuente
someObj.getTime().setHour(5)
no debería afectarsomeObj
el estado interno. También los setters y getters (accesores y mutadores por su nombre más elegante) tienen una firma de método muy estricta, lo que significa que getter no tiene ningún parámetro. Los métodos en general solo deberían hacer una cosa de todos modos.this
palabra clave es opcional a menos que haya un conflicto con algo que tenga un alcance más específico. En el ejemplo que dio, el definidor que se crea tendrá un solo parámetro cuyo nombre coincide con el nombre del campo, por lo tantothis.fieldName = fieldName
, se usa para distinguir que se está asignando el campo en lugar del parámetro que se asigna a sí mismo comofieldName = fieldname
se lograría. No existe tal conflicto en el captador.En Java, los getters y setters son funciones completamente ordinarias. Lo único que los convierte en getters o setters es la convención. Un getter para foo se llama getFoo y el setter se llama setFoo. En el caso de un booleano, el getter se llama isFoo. También deben tener una declaración específica como se muestra en este ejemplo de un getter y setter para 'name':
La razón para usar getters y setters en lugar de hacer públicos a sus miembros es que permite cambiar la implementación sin cambiar la interfaz. Además, muchas herramientas y conjuntos de herramientas que utilizan la reflexión para examinar objetos solo aceptan objetos que tienen captadores y definidores. Los JavaBeans, por ejemplo, deben tener getters y setters, así como algunos otros requisitos.
fuente
error: invalid method declaration; return type required
Cuando ejecuta el programa, el programa se inicia en la red,
setTime()
es llamada por el objeto ctime
se establece en el valor pasado porgetTime()
es llamada por el objeto ctod
ytod
se imprimiráfuente
También puede leer " Por qué los métodos getter y setter son malos ":
fuente
1. Los mejores getters / setters son inteligentes.
Aquí hay un ejemplo de javascript de mozilla:
Los he usado MUCHO porque son increíbles . Lo usaría cuando me pusiera elegante con mi codificación + animación. Por ejemplo, cree un establecedor que se ocupe de un
Number
que muestre ese número en su página web. Cuando se usa el establecedor, anima el número antiguo al nuevo número usando un tweener . Si el número inicial es 0 y lo establece en 10, verá que los números pasan rápidamente de 0 a 10, digamos, medio segundo. A los usuarios les encantan estas cosas y es divertido de crear.2. Getters / setters en php
Ejemplo de sof
citas:
fuente
Aquí hay un ejemplo para explicar la forma más sencilla de usar getter y setter en java. Se puede hacer esto de una manera más sencilla, pero getter y setter tienen algo especial que es cuando se usa un miembro privado de la clase principal en la clase secundaria en herencia. Puede hacerlo posible mediante el uso de getter y setter.
fuente