La chose importante à garder à l'esprit est que les appels de fonction de fournir une interface universelle. Tout objet peut interagir avec d'autres objets à l'aide d'appels de fonction. Tout ce que vous avez à faire est de définir le droit de signature, et vous allez loin. Le seul hic, c'est que vous avez à interagir uniquement par le biais de ces appels de fonction, qui souvent fonctionne bien, mais peut être maladroit dans certains cas.
La raison principale pour exposer les variables d'état directement serait d'être en mesure d'utiliser primitive directement les opérateurs sur ces champs. Quand il est bien fait, cela peut améliorer la lisibilité et la commodité: par exemple, l'ajout de nombres Complexes avec +
, ou l'accès à une collection assortie avec []
. Les avantages de ce qui peut être surprenant, à condition que votre utilisation de la syntaxe suit des conventions traditionnelles.
Le hic, c'est que les opérateurs ne sont pas une interface universelle. Seulement un ensemble très spécifique de types intégrés pouvez les utiliser, ils ne peuvent être utilisés de la manière que la langue s'attend, et vous ne pouvez pas définir de nouveaux. Et donc, une fois que vous avez défini votre interface publique à l'aide de primitives, vous êtes vous-même en utilisant des primitives, et seulement cette primitive (et d'autres choses qui peuvent être facilement moulé). Pour utiliser autre chose, vous avez à danser autour de cette primitive à chaque fois que vous interagissez avec elle, et qui vous tue d'un SÈCHE perspective: les choses peuvent devenir très fragile, très rapidement.
Certaines langues font les opérateurs dans une interface universelle, mais Java ne fonctionne pas. Ce n'est pas un acte d'accusation de Java: ses concepteurs ont choisi délibérément de ne pas inclure la surcharge d'opérateur, et ils avaient de bonnes raisons de le faire. Même lorsque vous travaillez avec des objets qui semblent correspondre à bien avec la traditionnelle significations des opérateurs, de les faire fonctionner d'une manière qui a du sens peut être étonnamment nuancé, et si vous n'avez pas absolument des ongles, vous allez payer pour ça plus tard. Il est souvent beaucoup plus facile de faire une fonction de l'interface lisible et utilisable que pour passer par ce processus, et souvent même le vent avec un meilleur résultat que si vous aviez utilisé les opérateurs.
Il y ont été compromis impliqués dans cette décision, cependant. Il y sont des moments où un opérateur basé sur l'interface fonctionne vraiment mieux qu'une fonction de base, mais sans la surcharge d'opérateur, cette option n'est pas disponible. En essayant d'incorporer les opérateurs en aucune façon de vous enfermer dans certaines décisions de conception que vous n'avez probablement pas vraiment envie d'être gravé dans la pierre. La Java des designers pensé que ce compromis a été utile, et ils pourraient même avoir été correcte à ce sujet. Mais les décisions comme cela ne vient pas sans quelques retombées, et ce genre de situation est l'endroit où les retombées hits.
En bref, le problème n'est pas d'exposer votre mise en œuvre, en soi. Le problème est de vous enfermer dans la mise en œuvre.