Sysena

Tag: API

Accessibilité en java, pour faire de belles API

by on avr.30, 2010, under Java

Il est recommandé dans tout programme, de réduire la portée (scope) des méthodes, variables, et classes au niveau le plus faible possible, afin de fournir des API solides, ou il est plus difficile de commettre des erreurs.

Portée (scope)

Portée des méthodes

Il existe 4 façons d’acceder à une méthode avec des scopes plus ou moins large :

Portée des méthodes
publicpublic method() {}Rend la méthode accessible depuis n’importe quelle classe
protectedprotected method() {}Rend la méthode uniquement accessible à la classe contenant la méthode, et à ses classes dérivés (classe « fille »)
privateprivate method() {}Rend la méthode accessible uniquement à la classe contenant la méthode
« friendly »method() {}Rend la méthode accessible uniquement aux classes du même package

Pour les méthodes public, protected et friendly, pensez à ajouter le mot clé « final », si vous souhaitez pas que ces méthodes puissent être surchargé.

Portée des variables

La portée des variables d’instances a un fonctionnement similaire à celle des méthodes. Au moyen des mots clés public, protected, et private, ainsi que l’absence de mot clé, on réduit la portée d’une variable d’instance.

Portée des variables
publicpublic Object objectRend la variable accessible depuis n’importe quelle classe
protectedprotected Object objectRend la variable accessible uniquement à la classe, et à ses classes dérivés (classe « fille »).
privateprivate Object objectRend la variable accessible uniquement à la classe.
« friendly »Object objectRend la variable accessible uniquement aux classes du même package

D’une façon générale, il vaut mieux éviter de déclarer des variables « public », l’utilisation d’un accesseur (get/set) étant plus approprié. Néanmoins, cela peut être utile, si vous souhaitez créer des classes assimilables aux structures du C/C++. Pour cet usage, on préfèrera l’usage de la classe « Properties » qui permet de stocker facilement des key/values, sans ambiguïté si la clé n’existe pas / n’a pas été initialisé.

Portée des classes

Ce point la, pourtant essentiel est souvent oublié.

Il existe 2 types de classe : les classes « standard » et les classes imbriquées (nested class). Ces dernières comme l’indiquent leurs noms sont des classes à l’intérieur d’autres classes.

Classes standard

Portée des classes
publicpublic class MyClass {}Rend la classe accessible à tous les packages
« friendly »class MyClass {}Rend la classe accessible uniquement aux classes du même package.

Les classes sont généralement déclarés public, afin de pouvoir etre instancié partout. Il est pourtant possible de les déclarer sans mot clé afin de réduire le scope de la classe à son package. L’interet est majeur, pour fournir des API packagées, avec des classes internes, que l’utilisateur ne pourra pas étendre, et donc éviter des comportements inattendu.

Classes imbriquées (nested class)

Il existe 2 sous catégories aux classes imbriqués : les classes imbriquées statiques (static nested class), et les classes imbriquées non statiques (inner class). Les static nested class fonctionnent exactement comme une classe standard, et ne peuvent accéder aux variables d’instances de la classe la contenant (=> à eviter).

Portée des classes imbriquées non statiques
publicpublic class MyClass {}Rend les instances de la nested class manipulable dans toutes les classes
protectedprotected class MyClass {}Rend les instances de la nested class manipulable dans toutes les classes du meme package (une petite bizarrerie …)
privateprivate class MyClass {}Rend les instances de la nested class manipulable uniquement dans la classe la contenant
« friendly »class MyClass {}Rend les instances de la nested class manipulable dans toutes les classes du meme package

Les inner class se rapportent toujours à l’instance de la classe contenant l’inner class. Elles sont donc liés à l’état des autres variables de l’instance qui a permis d’initialiser l’inner class. (Il est impossible d’instancier une inner class sans qu’elle se rapporte à sa classe mere. L’instanciation en dehors de la classe mere se fait de la façon suivante : « InnerClass motherClass.new InnerClass(); », L’objet motherClass correspondant à une instance de la classe contenant InnerClass).

___

Voila, ce petit post avait surtout pour but de souligner qu’il est possible de réduire la visibilité d’une classe, et pas seulement de variable et méthode. Il est important également de founir des interfaces plutôt que des classes à l’utilisateur final, au moyen de factory, mais cela fera l’object d’un autre post !

Maintenant, à vous de founir des API de qualité en réduisant toujours au strict nécessaire la visibilité de vos classes, méthodes et variables ! :)

Leave a Comment :, more...