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é :
private qui n'est visible qu'à l'intérieur de la classe.public qui est visible à l'extérieur de la classe.default/package (souvent appelée visibilité package-private) 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. Cette visibilité peut conduire à une portée d'accès trop large pour notre usage car les classes qui hérient peuvent se trouver dans d'autres packages. Comme nous n'utiliserons l'héritage que comme une solution locale de factorisation du code, nous n'utiliserons pas cette visibilité.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.