Partage
  • Partager sur Facebook
  • Partager sur Twitter

Get et Set

Explication des deux methode

Sujet résolu
11 mars 2008 à 21:02:28

slt , je veux bien comprendre les 2 methodes java, GET et SET , ainsi que la difference entre les 2 . et merci bqp.<code type="java">
  • Partager sur Facebook
  • Partager sur Twitter
11 mars 2008 à 21:11:06

Voici ce que je sais (si c' est la même chose que le C++) :
Le Get est une fonction renvoyant une propriété, alors que le Set définit la propriété. Une proprieté d' un objet ne devrait jamais être accédée directement en Java...
  • Partager sur Facebook
  • Partager sur Twitter
11 mars 2008 à 22:15:38

merci bien, j aimerai bien savoir plus de details . mais bn merci pr la reponse .:)
  • Partager sur Facebook
  • Partager sur Twitter
11 mars 2008 à 23:58:38

Salut,

si tu parles des accesseurs ou modificateurs en Java alors je vais essayer de te répondre.

En faites, ce qu'il se passe, c'est lors de la création de ta classe, tu dois définir des attributs (variables) privées afin que la personne qui utilise ta classe ne puisse pas modifier les attributs de la comme il le souhaite. Cependant, lorsque ces attributs sont privés, ils sont inaccessibles depuis une autre classe. Cependant, il existe un moyen de les afficher via une méthode get...()
et il est possible de modifier les attributs via une méthode set. Cela est très utile de pouvoir afficher un attribut privé et tu peux protéger tes données via set en imposant par exemple des conditions.

Voici un exemple (qui j'espère tient la route), par contre j'ai mis le main directement (éviter de mettre le main dans la même afin de voir la différence avec private et public):
  1. public class livre
  2. {
  3.         private int nombreDePages;//attributs privés
  4.         private String auteur;
  5.         private String editeur;
  6.         //le constructeur va nous permettre de créer un livre
  7.         public livre (int nombreDePages, String auteur, String editeur)
  8.         {
  9.                 this.nombreDePages = nombreDePages;
  10.                 this.auteur = auteur;
  11.                 this.editeur = editeur;
  12.         }
  13.         //cette méthode permet de connaitre ton auteur
  14.         public String getAuteur()
  15.         {
  16.                 return auteur;
  17.         }
  18.         //cette méthode permet de modifier ton auteur alors qu'il est en private
  19.         //essaie de modifier auteur sans cette méthode dans le main et tu verras la différence
  20.         public void setAuteur(String nouvelAuteur)
  21.         {
  22.                 auteur = nouvelAuteur;
  23.         }
  24.         //on crée notre bouquin
  25.        //Crée le main dans une autre classe
  26.         public static void main(String [] args)
  27.         {
  28.                 livre livre_a = new livre(250,"auteur_a","editeur_a");
  29.                 System.out.println(livre_a.getAuteur());
  30.                 livre_a.setAuteur("auteur_nouveau");
  31.                 System.out.println(livre_a.getAuteur());
  32.         }
  33. }


Edit : correction de "ta classe" pour "une autre classe"

En espérant ne pas avoir répondu à côté de la plaque.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 0:12:28

Tu te trompes dod!

Un attribut, même si il est private, on peut y accéder dans la classe! Sinon, même les SET ne pourraient rien y faire!


En java, il y a trois type d'attributs:

les public : ceux là sont accessible de partout

les protected : ceux là sont accessible depuis la classe ou ils sont déclarés et depuis les classes qui héritent de cette classe.

les private, enfin, ne sont accessible que depuis la classe dans laquelle ils sont déclaré.


Du coup, si tu est dans une autre classe que la classe ou tu as déclaré ton attribut private, tu ne peux pas le modifier autrement qu'en faisant appel à une méthode de cet classe, que l'on nomme setAttribut en général, et qui ne fait qu'affecter une valeur à ton attribut. Ta méthode SET elle peut le faire puisqu'elle est dans la classe ou ton attribut est déclaré!

Même principe pour le GET, toujours si ton attribut est privé, c'est ton seul moyen de recupérer le contenu de ta variable.

Humm, j'ai pas l'impression d'avoir été super clair là! :D
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 0:16:27

euh, Bayo c'est pour cela que j'ai ajouté le cependant. J'ai bien dit qu'il était possible de modifier un attribut via la méthode set. En tout cas merci de bien préciser les différents types d'attributs et leurs significations car ce n'est pas toujours clair sur certains sites.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 0:19:32

Citation : dod

Cependant, lorsque ces attributs sont privés, ils sont inaccessibles de puis ta classe.



Ca c'est faux, ou du moins très ambigu ou pas assez explicité.

Si un attribut d'une classe A est private, il est accessible tant qu'on est dans la classe A directement! Par contre, il est effectivement inaccessible si on cherche à l'atteindre depuis une classe B, sans passer par des accesseurs.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 0:24:12

Oui, c'est vrai mais c'était plus ou moins évident. J'avais en tête l'utilisation de plusieurs classes donc je ne pensais pas à une seule classe. Oui, c'est vrai que si c'est dans la même classe mais si c'est dans une autre classe là ce n'est pas possible. J'avoue ne pas avoir été suffisamment clair mais merci de m'avoir corriger.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 0:45:43

Sinon on parle plus de mutateurs que de modificateurs, non ?
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 3:49:33


"Java, ou le langage qui a mangé mon cerveau."


Bayo et dod > question surprise ! Java est-il un langage orienté objet ? Si oui, pourquoi utilisez-vous parfois le mot "classe" comme un synonyme du mot "objet" ?


bestsuan > Concernant les méthodes get/set, le principe est assez simple à comprendre : Certaines variables d'instance ont des caractéristiques bien précises. Par exemple, l'âge d'une personne est toujours positif (on ne peut pas avoir "moins vingt ans"). Seulement, si notre variable age est modifiable en dehors de l'objet, rien n'empêche qu'un autre objet malintentionné (ou buggé) change l'âge pour une valeur négative.

  1. Personne tom = new Personne("Tom", 47);
  2. tom.age = -20; // ooups!

Pour empêcher ça, on peut restreindre la portée de la variable age (pour qu'elle ne soit modifiable que depuis l'objet). Ça implique donc que la variable age est totalement inaccessible depuis l'extérieur de l'objet... ce qui est un peu gênant : ce qu'on cherche à faire, c'est autoriser la lecture et la modification de l'âge mais d'une manière sécurisée.
Pour y parvenir, on ajoute donc deux méthodes : getAge(), qui retourne l'âge, et setAge(int new_age) qui vérifie que le nouvel âge est bien positif avant de modifier la variable age.

En pratique (du moins, selon mon expérience personnelle), on a rarement besoin de contrôler ce genre de choses. Seulement, quand ça se produit, on passe par les méthodes get/set ... et on réalise que du point de vue de l'uniformité sémantique, c'est pas très propre : Parfois, on utilise tom.prenom et d'autre fois tom.getAge(). Pour réduire les doutes ("est-ce que le prénom est accessible ou pas ?"), le recours à get/set est donc systématique (et appliqué, pour autant que je sache, par tous les bibliothèques java).
Par ailleurs, si on réalise trop tard que les méthodes get/set nous seraient utiles, on est obligé de modifier tout le code existant (pour remplacer tom.prenom par tom.getPrenom() et etc..).

Bref, il y a entre autre Ruby qui propose une solution syntaxiquement esthétique à ce niveau (bien qu'imparfaite!). Les Javateux, de leur côté, préfèrent recourir systématiquement aux méthodes get/set, sans trop savoir pourquoi en général, parce que c'est rentré dans les mœurs du langage (l'exemple de Boya en est criant : ses méthodes get/set sont verbeuses et n'apportent rien !).

À vous de peser le pour et le contre après, mais dans un langage comme Java, ça me semble clairement une habitude à prendre, quoi qu'on en pense.


Bref, j'espère au moins que ce topic permettra aux débutants intéressés par le paradigme objet de ne pas commencer par Java, parce que vous n'apprendrez certainement pas à l'OO avec ce langage. Les deux zombis sont là pour en témoigner :) .
Préférez Smalltalk et/ou Io. Sérieusement. Java is dead & brain-dead.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 13:10:34

merci bien pour vos reponse ,c était bien interessant.Merci ;):)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
12 mars 2008 à 18:06:56

En C#, y'a pas de problème, regardez le code il parle tout seul :
  1. public class Homme
  2. {    
  3.         private int _age = 20;
  4.         public int Age
  5.         {
  6.             get
  7.             {
  8.                 return _age;
  9.             }
  10.             set
  11.             {
  12.                 if (value > 0)
  13.                     _age = value;
  14.             }
  15. }


Comme C# ressemble à Java, ca doit exister aussi en Java non ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
12 mars 2008 à 18:38:59

@Artefact :

c'est juste du sucre syntaxique normalisé dans C#, le sous jacent reste des methodes (Get_X, Set_X, cf. reflector). Java ne le propose pas (en fait assez peu de langage le font, vu que ca ne change rien).
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
12 mars 2008 à 18:49:28

Oui tu as raison.

Mais ca permet d'avoir une syntaxe un peu moins dégeu :
  1. // Au lieu de :
  2. objet.SetValue(5);
  3. // On a
  4. objet.Value = 5;
  5. // Tout en contrôlant les entrées.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 19:58:58

lastsseldon > euh, pour java, je ne vois pas trop ce que tu veux dire avec "synonyme,objet,classe" (pourrais-tu être un plus précis, merci). Un objet est la matérialisation, réalisation de la classe. Ainsi, la classe décrit un objet, elle est le moule qui contient l'ensemble de la description d'un objet.
Par contre, Java est effectivement très dur à apprendre (selon moi) et que ça tue le cerveau.
  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2008 à 23:50:15

Citation : dod

lastsseldon >tivement très dur à apprendre (selon moi) et que ça tue le cerveau.


je le trouve carrement plus simple que le c++, sauf peut etre au niveau de l'api .. mais elle est tellement enorme que c'est difficile de bien la connaitre
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2008 à 0:16:48

On accède pas aux attributs depuis la classe dod, mais depuis les instances de la classe (cf quasiment toutes vos explications sur la portée des variables). Vous confondez le modèle et les instances dans vos explications, et même si c'est une pratique "courante" quand on explique un code Java, je trouve qu'elle dénote d'une incompréhension de la pensée objet ;) .

Sinon, concernant la difficulté d'apprentissage du Java, est-ce que c'est justifié ? Par exemple, si on considère des langages comme Haskell, qui sont très dur à apprendre, c'est en partie parce qu'on apprend des choses sur la programmation et pas seulement sur le langage en question. Est-ce que t'as l'impression d'être plus cultivé maintenant que tu confonds plus public/protected/private ? :)
Quels concepts Java apporte-t-il qui méritent d'apprendre ce langage ? Ou tout du moins, qui expliquent pourquoi il soit si difficile à apprendre ?
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2008 à 1:07:46

Je pense que Java même si apparement il est plus simple à apprendre que le C++, il est (pour moi) difficile d'utiliser un très grand nombre de classes sans galérer pendant pas mal de temps.
> lastsseldon : tu veux dire qu'on ne différencie pas, la création de la classe et l'instanciation de celle-ci. C'est-à-dire qu'on le confond la création, construction d'une classe et l'instanciation de celle-ci. Dans le sens où l'on n'a pas été clair entre structure (attributs, méthodes, mise en forme) de la classe et la création de l'objet.

Si c'est cela alors oui c'est clairement le cas. Est-ce que cela révèle d'un manque de compréhension de la POO ou est-ce que nous l'avons pas suffisament bien expliquer. J'opterai dans un premier temps pour la deuxième solution, je pense surtout que mes explications manquaient de clarté.

  • Partager sur Facebook
  • Partager sur Twitter
15 mars 2020 à 0:53:41

Bonjour est ce que l'utilisation de get et set dans c# est obligatoire ?

si oui pour quoi le code est exécutable sans l’utilisé ? :( et merci
  • Partager sur Facebook
  • Partager sur Twitter
15 mars 2020 à 1:31:05

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter