Accesseur et mutateur

Résolu/Fermé
chaa13 - 2 juin 2013 à 14:26
 chaa13 - 2 juin 2013 à 17:38
Hey,
En reprenant un peut le java je voyais cette histoire de mettre les variable d'instance en private puis crée des méthode (mutateur et accesseur) pour pouvoir agir dessus. Mais j'ai du mal a comprendre a quoi ça sert de les mettre en private et de faire tout ca pourquoi ne pas tout simplement les mettre en public et y accéder directement, je ne comprend pas l'intérêt ! Si quelqu'un pourrait m'éclaircir la dessus ça serait cool merci ;)
(même en relisant plusieurs fois le tuto du site du zero j'ai vraiment du mal a comprendre)


A voir également:

5 réponses

Ok merci !
Donc pour résumer des que je voudrais faire un programme qui tient la route je devrais utiliser les accesseurs et mutateurs pour être sur qu'on ne mette pas n'importe quel valeurs a mes variables d'instances. Y'a t-il une autre raison que contrôler les variable qui sont écrite ou même lu ?
merci
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 juin 2013 à 16:44
Bien sûr qu'il y a d'autres raisons, par exemple celle que je décrivais tout à la fin, parfois on veut avoir des accesseurs sur des valeurs alors que les données ne correspondent pas forcément aux attributs déclarés.

Exemple : tu peux avoir un accesseur sur l'age d'une personne, alors qu'en réalité ta variable privée sera la date de naissance...
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 juin 2013 à 14:46
C'est pour donner le contrôle des données aux méthodes de la classe et pas à n'importe qui lors de la réutilisation du code.

Par exemple, si tu veux avoir un double pour la masse d'un objet, alors cette masse doit toujours être positive, or si tu mets cet attribut public, rien n'empêchera de mettre un nombre négatif, ce qui n'aurait plus aucun sens !

Voici deux codes que tu pourrais faire :

public Chose
{
    public double masse;
}

Chose truc = new Chose();
truc.masse = -50; // possible mais dangereux !

//-------------------------

public Chose
{
    private double masse;
    
    public void setPoids(double masse)
    {
        if (masse<0)
            throw new IllegalArgumentException("masse négative");
        else
            this.masse = masse;
    }
}

Chose truc = new Chose();
truc.setMasse(-50); // impossible : une exception est générée

Il faut bien comprendre que l'intérêt de la programmation Java c'est la réutilisabilité du code, c'est à dire que tu dois gérer tout ce qui est autorisé ou interdit dans ton code privé, afin qu'il ne soit ensuite possible, dans la partie publique de ne faire que des choses correctes.

En plus, souvent, il y a des méthodes d'accès publique qui contrôlent les données alors que leur représentations en mémoire privée n'a rien à voir.
C'est le cas par exemple de la gestion des dates, représentés en privé par un entier long, mais pour laquelle on a des accesseurs getJour(), getMois()... qui fournissent à l'utilisateur un accès cohérent et sécurisé aux données.
0
Ha ! Ok je comprends mieux maintenant, ça nous donne vraiment le contrôle !
Dernier petit truc, si je suis dans ma classe, je travaille dedans pour manipuler les variable je devrai utiliser les accesseur et mutateur ou je pourrais directement les changer ?
Merci ;)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 juin 2013 à 17:16
Dans ta classe tu fais ce que tu veux, d'ailleurs il est plus efficace de le faire directement plutôt que d'appeler une méthode intermédiaire qui fera des contrôles qui seront le plus souvent inutiles vu que tu sais que c'est correct.

Par exemple, si tu veux ajouter 5 à la masse de la classe Chose, tu pourrais faire :

public Chose
{
    private double masse;
    
    public void setPoids(double masse)
    {
        if (masse<0)
            throw new IllegalArgumentException("masse négative");
        else
            this.masse = masse;
    }

    public double getPoids()
    {
        return poids;
    }

    public void methode1()
    {
        setPoids(getPoids()+5);
    }

    public void methode2()
    {
        masse += 5;
    }
}

La méthode 2 est beaucoup mieux que la méthode 1, en effet tu n'as pas besoin d'appeler une méthode qui va lire la valeur, et une autre qui va l'écrire, en faisant des contrôles de signes inutiles car tu sais que la masse est positive et qu'en rajoutant 5 elle le sera encore !

Cependant, pour des opérations complexes il est intéressant de faire appel aux méthodes déjà faites, même si elles sont dans la même classe, ça évite d'avoir à faire un copier-coller du code, comme ça en cas de modification de la méthode appelé, tu n'auras pas à modifier le code que tu avais copié-collé (ce sera le cas par exemple avec les jours/mois/année des dates)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ça marche, merci beaucoup, ça m'a vraiment aider :)
0