Le code extérieur n'utilise que les méthodes publiques !
Pour voir comment cela se traduit en Java et en Python, il faut cliquer sur la flèche du bas.
Java offre plusieurs niveaux de visibilités:
private
qui n'est visible qu'à l'interieur de la classe.public
qui n'est visible qu'à l'interieur de la classe.default/package
qui n'est visible que depuis une classe appartenant au même package.protected
qui est visible par la classe et les classes qui en hérite. Nous n'utiliserons quasiment jamais l'héritage donc quasiment jamais protected.Les indications de visibilité sont là pour aider/guider les utilisateurs de votre code mais il est toujours possible de passer outre en utilisant la réflexion.
Python n'offre pas de notion de visibilité aussi explicite et aussi fine qu'en Java.
Cependant on peut définir une méthode ou un champ comme privé en préfixant son nom par deux underscores.
L'interpréteur Python renommera la méthode ou le champ pour le cacher de l'utilisateur mais il est toujours possible d'y accéder.
Un objet définit:
Les méthodes publiques d'un objet définissent son contrat avec le monde extérieur. Les autres objets sont ses clients et ses méthodes publiques sont les services qu'il offre.
Attention, en POO, on parle d'interface plutôt que de contrat mais ce n'est pas nécessairement une interface au sens Java du terme.
Les objets clients ou utilisateurs d'un objet ne se basent que sur son contrat/interface, pas sur comment il est implémenté. Si l'on change, le contrat d'un objet tous ses clients sont impactés.
⇛ Il faut bien réfléchir avant de rajouter une méthode au contrat/interface d'une objet.
L'objet est le seul responsable de la cohérence de son état.
Le constructeur est le point d'entrée pour la création de l'objet:
Les méthodes publiques doivent maintenir la cohérence de l'état: ⇛ Attention aux getters et aux setters !!!!
Un objet immutable si son état ne peut plus être modifié après la construction.
Pour un objet immutable, il n'y a pas de problème de cohérence de l'état.
En particulier, aucun problème de concurrence !
⇛ Quand c'est possible, c'est un plus.
Si l'immutabilité est si bien, pourquoi ne pas rendre tous les objets immutables!
Problème de performance : tout changement implique de recréer complètement un nouvel objet.