2010-01-10 7 views
85

Je viens du monde des php. Pourriez-vous expliquer ce que les getters et les setters sont et pourraient vous donner quelques exemples?Comment fonctionnent les getters et les setters?

+5

Essayez de les éviter dans la programmation orientée objet: http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html – yegor256

+0

@ yegor256 Je comprends votre chien et balle l'analogie et je la soutiens même, mais qu'en est-il quand un objet «organisme vivant» stocke la valeur primitive occasionnelle, par exemple un identifiant? Et si vous voulez aller au-delà de la simple affectation, mais que vous ne voulez pas écrire une nouvelle classe uniquement pour gérer les valeurs primitives? – Jacksonkr

Répondre

105

Le didacticiel n'est pas vraiment requis pour cela. Lire sur 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

alors getter est juste une méthode pour obtenir un champ privé et setter est en train de définir un nouveau champ. merci pour l'excellente explication par le code – ajsie

+1

pourriez-vous passer un paramètre à un getter? – ajsie

+2

noname: Non et non. Getter est un moyen d'obtenir une valeur mais pas d'exposer la valeur contenue dans un champ, c'est-à-dire si vous appelez 'someObj.getTime(). SetHour (5)' cela ne devrait pas affecter l'état interne de 'someObj'. De plus, les setters et getters * (accesseurs et mutators par leur nom d'amateur) * ont une signature de méthode très stricte signifiant que getter n'a aucun paramètre. Les méthodes en général ne devraient faire qu'une chose de toute façon. – Esko

29

Dans Java getters et setters sont des fonctions tout à fait ordinaires. La seule chose qui fait d'eux des getters ou des setters est la convention. Un getter pour foo est appelé getFoo et le setter est appelé setFoo. Dans le cas d'un booléen, le getter s'appelle isFoo. Ils doivent également avoir une déclaration spécifique comme indiqué dans cet exemple d'un getter et setter pour « nom »:

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 raison d'utiliser des accesseurs au lieu de faire vos membres du public est qu'il permet de changer l'implémentation sans changer l'interface. En outre, de nombreux outils et boîtes à outils qui utilisent la réflexion pour examiner les objets n'acceptent que les objets qui ont des getters et des setters. Par exemple, JavaBeans doit avoir des getters et setters ainsi que d'autres exigences.

+9

Ces constructeurs ne devraient-ils pas avoir 'void'? –

+0

Le vide est réellement nécessaire ici. Si vous ne l'avez pas, vous obtenez: 'error: déclaration de méthode invalide; return type required' – Dan

+3

Le vide n'est pas requis ici –

6

Vous pouvez également lire "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); 
} 
} 

Lorsque vous exécutez le programme, le programme démarre dans les conduites principales,

  1. objet c est créé
  2. fonction setTime() est appelé par l'objet c
  3. la time variable est définie à la valeur transmise par
  4. fonction getTime() est appelée par objet c
  5. le temps est retourné
  6. Il se passe à tod et tod obtenir imprimé
2

1. Les meilleurs getters/setters sont intelligents.

Voici un exemple 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) 

Je l'ai utilisé ces beaucoup parce qu'ils sont génial. Je l'utiliserais quand j'aurais envie de mon codage + animation. Par exemple, créez un setter qui traite un Number qui affiche ce nombre sur votre page Web. Lorsque le setter est utilisé, il anime l'ancien numéro au nouveau numéro en utilisant un tweener. Si le nombre initial est 0 et que vous le réglez sur 10, vous verrez rapidement les chiffres passer de 0 à 10, disons une demi-seconde. Les utilisateurs aiment ce genre de choses et c'est amusant de créer.

2.Getters/setters en php

Exemple 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; 
    } 
} 
?> 

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

Je ne vais pas vous downvote (ne vaut pas la peine). Veuillez noter que (1) Vous avez répondu à une question ** Java **, où la langue du programme doit être Java. (2) Si vous voulez poster, assurez-vous que la mise en page est faite correctement. (3) Votre utilisation de l'encapsulation (getter (ou accessor) et setters (ou mutators)) est incorrecte. S'il vous plaît chercher ce que signifie l'encapsulation ... (Vérifiez la réponse votée) – KarelG

+0

@KarelG Désolé, je n'ai pas lu les balises. Je l'ai mis à jour en Java.merci de me réaliser. –

Questions connexes