¿Cómo funcionan los getters y setters?


107

Soy del mundo php. ¿Podrías explicar qué son los getters y setters y darte algunos ejemplos?


@ 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

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

11
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':

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = 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.


9
¿No deberían esos constructores tener 'vacío'?
Jason Hartley

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
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

Cuando ejecuta el programa, el programa se inicia en la red,

  1. se crea el objeto c
  2. la función setTime()es llamada por el objeto c
  3. la variable timese establece en el valor pasado por
  4. la función getTime()es llamada por el objeto c
  5. se devuelve el tiempo
  6. Pasará tody todse imprimirá

10

También puede leer " Por qué los métodos getter y setter son malos ":

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.


3

1. Los mejores getters / setters son inteligentes.

Aquí hay un ejemplo de javascript de mozilla:

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.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
class MyClass {
  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;
  }
}
?>

citas:


2

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;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            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.
Bashir ahmad
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.