@ 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
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;}
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':
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.
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
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);}}
Lorsque vous exécutez le programme, le programme démarre sur secteur,
l'objet c est créé
la fonction setTime()est appelée par l'objet c
la variable timeest définie sur la valeur passée par
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.
1. Les meilleurs getters / setters sont intelligents.
Voici un exemple 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)
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
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;}}?>
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;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();}}
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é.
Réponses:
Un didacticiel n'est pas vraiment nécessaire pour cela. En savoir plus sur l' encapsulation
la source
someObj.getTime().setHour(5)
cela ne devrait pas affectersomeObj
l'é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.this
mot-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équentthis.fieldName = fieldName
, est utilisé pour distinguer que le champ est assigné plutôt que le paramètre est assigné à lui-même comme lefieldName = fieldname
ferait. Aucun conflit de ce type n'existe dans le getter.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':
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.
la source
error: invalid method declaration; return type required
Lorsque vous exécutez le programme, le programme démarre sur secteur,
setTime()
est appelée par l'objet ctime
est définie sur la valeur passée pargetTime()
est appelée par l'objet ctod
et seratod
impriméla source
Vous pouvez également lire " Pourquoi les méthodes getter et setter sont mauvaises ":
la source
1. Les meilleurs getters / setters sont intelligents.
Voici un exemple javascript de Mozilla:
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
Number
qui 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
citations:
la source
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.
la source