2010-01-10 34 views
85

Soy del mundo php. ¿Podrías explicar qué son los captadores y establecedores y podrían darte algunos ejemplos?¿Cómo funcionan getters y setters?

+5

tratar de evitarlos en la programación orientada a objetos: http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html – yegor256

+0

@ yegor256 entiendo su perro y bola analogía e incluso la apoyo, pero ¿qué ocurre cuando un objeto "organismo vivo" almacena el valor primitivo ocasional, por ejemplo, una identificación? ¿Qué sucede si desea ir un paso más allá de la asignación simple pero no desea escribir una nueva clase solo para manejar valores primitivos? – Jacksonkr

Respuesta

105

El tutorial no es realmente necesario para esto. Lea sobre encapsulation

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; 
} 
+7

así getter es solo un método para obtener un campo privado y setter está configurando un nuevo campo. gracias por la excelente explicación del código – ajsie

+1

¿podría pasar un parámetro a un getter? – ajsie

+2

noname: No y no. Getter es una forma de obtener un valor pero NO expone el valor contenido en un campo, es decir, si llama 'someObj.getTime(). SetHour (5)' no debería afectar el estado interno de 'someObj'. También setters y getters * (acceso y mutadores por su nombre más elegante) * tienen un método muy estricto 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

29

En Java getters y setters son funciones completamente comunes. Lo único que los hace 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 el 'nombre':

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 de usar captadores y definidores en vez de hacer los miembros de su público es que hace que sea posible cambiar la implementación sin cambiar la interfaz. Además, muchas herramientas y kits de herramientas que utilizan la reflexión para examinar objetos solo aceptan objetos que tienen getters y setters. JavaBeans, por ejemplo, debe tener getters y setters, así como algunos otros requisitos.

+9

¿No deberían esos constructores no tener 'vacío'? –

+0

Void es realmente necesario aquí. Si no lo tiene, obtiene: 'error: declaración de método no válido; return type required' – Dan

+3

Void no es necesario aquí –

6

También puede leer "Why getter and setter methods are evil":

Though getter/setter methods are commonplace in Java, they are not particularly object oriented (OO). In fact, they can damage your code's maintainability. Moreover, the presence of numerous getter and setter methods is a red flag that the program isn't necessarily well designed from an OO perspective.

This article explains why you shouldn't use getters and setters (and when you can use them) and suggests a design methodology that will help you break out of the getter/setter mentality.

11
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 se ejecuta el programa, el programa se inicia en la red,

  1. objeto c se crea
  2. función setTime() es llamado por el objeto c
  3. la variable time se establece en el valor pasado por
  4. función getTime() es llamado por objeto c
  5. el tiempo se volvió
  6. Será passe a tod y tod se imprimen a cabo
2

1. Los mejores getters/setters son inteligentes.

Aquí está 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) 

He usado estos mucho porque son impresionante. Lo usaría cuando me gustara con mi codificación + animación. Por ejemplo, crea un setter que se ocupe de un Number que muestra ese número en tu página web. Cuando se usa el colocador, anima el número anterior al nuevo utilizando un tweener. Si el número inicial es 0 y lo configuras a 10, entonces verás que los números cambian 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 desde 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; 
    } 
} 
?> 

citings:

0

example is here to expalin this most simple way of using getter and setter in 'java' . one can do this by more straight forward way but getter and setter has something special that is when using private member of parent class in child class in inheritance. you can make it possible through using getter and 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(); 
     } 

    } 
+0

No voy a devolverte el voto (no vale la pena el esfuerzo). Tenga en cuenta que (1) ha respondido en una pregunta de ** Java **, donde el idioma 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 (getter (o acceso) y setters (o mutators)) es incorrecto. Busque lo que significa la encapsulación ... (marque la respuesta) – KarelG

+0

@KarelG lo siento, no leí las etiquetas. Lo actualicé a java.gracias por darme cuenta. –

Cuestiones relacionadas