Comment fonctionnent les getters et les setters?

107

Je viens du monde php. Pouvez-vous expliquer ce que sont les getters et les setters et pourriez-vous vous donner quelques exemples?

Ajsie
la source
@ yegor256 Je comprends votre analogie avec le chien et la balle et je la soutiens même, mais qu'en est-il lorsqu'un objet "organisme vivant" stocke occasionnellement une valeur primitive, par exemple un identifiant? Que faire 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éponses:

127

Un didacticiel n'est pas vraiment nécessaire pour cela. En savoir plus sur l' 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;
}
Paul Creasey
la source
11
donc getter est juste une méthode pour obtenir un champ privé et le setter définit un nouveau champ. merci pour l'excellente explication par 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 que si vous l'appelez, someObj.getTime().setHour(5)cela ne devrait pas affecter someObjl'état interne de. Les setters et les getters (accesseurs et mutateurs par leur nom plus sophistiqué) ont également une signature de méthode très stricte, ce qui signifie que le getter n'a aucun paramètre. Les méthodes en général ne devraient faire qu'une seule chose de toute façon.
Esko
4
@noname: Quand des choses simples reçoivent des noms complexes / grands / abstraits, vous avez ce qu'on appelle un "modèle de conception" .... Et ceci est un exemple du modèle d'explication de concept récursif que je viens d'inventer ;-)
namespaceform
3
@qed: le thismot-clé est facultatif sauf s'il y a un conflit avec quelque chose qui a une portée plus spécifique. Dans l'exemple que vous avez donné, le setter qui est créé aura un seul paramètre dont le nom correspond au nom du champ, par conséquent this.fieldName = fieldName, est utilisé pour distinguer que le champ est assigné plutôt que le paramètre est assigné à lui-même comme le fieldName = fieldnameferait. Aucun conflit de ce type n'existe dans le getter.
Paul Creasey
39

En Java, les getters et les setters sont des fonctions tout à fait ordinaires. La seule chose qui les rend getters ou 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 est appelé isFoo. Ils doivent également avoir une déclaration spécifique, comme indiqué dans cet exemple de getter et setter pour '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 raison d'utiliser des getters et des setters au lieu de rendre vos membres publics est que cela 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 des objets n'acceptent que les objets qui ont des getters et des setters. Les JavaBeans, par exemple, doivent avoir des getters et des setters ainsi que d'autres exigences.

Mark Byers
la source
9
Ces constructeurs ne devraient-ils pas avoir du «vide»?
Jason Hartley
Le vide est en fait nécessaire ici. Si vous ne l'avez pas, vous obtenez:error: invalid method declaration; return type required
Dan
3
Le vide n'est pas requis ici
Shashi Kiran
2
@JasonHartley: Un constructeur n'a pas de type de retour.
wassimans
@Mark Byers Ainsi, le constructeur est utilisé pour initialiser l'instance, et le setter est utilisé pour changer n'importe quel attribut donné. Est-ce correct?
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);  
 }
}  

Lorsque vous exécutez le programme, le programme démarre sur secteur,

  1. l'objet c est créé
  2. la fonction setTime()est appelée par l'objet c
  3. la variable timeest définie sur la valeur passée par
  4. la fonction getTime()est appelée par l'objet c
  5. l'heure est retournée
  6. Il passera todet sera todimprimé
user3137648
la source
10

Vous pouvez également lire " Pourquoi les méthodes getter et setter sont mauvaises ":

Bien que les méthodes getter / setter soient courantes en Java, elles ne sont pas particulièrement orientées objet (OO). En fait, ils peuvent endommager la maintenabilité de votre code. De plus, la présence de nombreuses méthodes getter et setter est un drapeau rouge indiquant que le programme n'est pas nécessairement bien conçu du point de vue OO.

Cet article explique pourquoi vous ne devriez pas utiliser les getters et les setters (et quand vous pouvez les utiliser) et suggère une méthodologie de conception qui vous aidera à sortir de la mentalité getter / setter.

superfav
la source
3

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 les ai beaucoup utilisés parce qu'ils sont géniaux . Je l'utiliserais lorsque je deviendrais fantaisie avec mon codage + animation. Par exemple, créez un setter qui traite un Numberqui affiche ce numéro sur votre page Web. Lorsque le setter est utilisé, il anime l'ancien numéro vers le nouveau numéro à l'aide d'un tweener . Si le nombre initial est 0 et que vous le définissez sur 10, vous verrez les nombres passer rapidement de 0 à 10, disons, une demi-seconde. Les utilisateurs adorent ce truc et c'est amusant à 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;
  }
}
?>

citations:

Jacksonkr
la source
2

Voici un exemple pour expliquer la manière la plus simple d'utiliser getter et setter en java. On peut le faire d'une manière plus simple, mais le getter et le setter ont quelque chose de spécial qui se produit lors de l'utilisation d'un membre privé de la classe parent dans la classe enfant en héritage. Vous pouvez rendre cela possible en utilisant getter et 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();
        }

    }
Bashir Ahmed
la source
Je ne vais pas vous rejeter (cela ne vaut pas la peine). Veuillez noter que (1) Vous avez répondu à une question Java , où le langage du programme devrait être en Java. (2) Si vous souhaitez publier, assurez-vous que la mise en page est faite correctement. (3) Votre utilisation de l'encapsulation (getter (ou accesseur) et setters (ou mutators)) est incorrecte. Veuillez rechercher ce que signifie l'encapsulation ... (Vérifiez la réponse votée)
KarelG
1
@KarelG désolé, je n'ai pas lu les balises. je l'ai mis à jour en java. merci de m'avoir réalisé.
Bashir ahmad