web-dev-qa-db-fra.com

'finale statique publique' ou 'finale statique privée' avec getter?

En Java, on enseigne que les variables doivent rester privées pour permettre une meilleure encapsulation, mais qu'en est-il des constantes statiques? Ce:

public static final int FOO = 5;

Serait équivalent en résultat à ceci:

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

Mais quelle est la meilleure pratique?

41
Chris Cummins

Il y a une raison pour ne pas utiliser une constante directement dans votre code.

Supposons que FOO puisse changer plus tard (tout en restant constant), dites à public static final int FOO = 10;. Ne devrait rien casser tant que personne n'est assez stupide pour coder la valeur directement, n'est-ce pas?

Non. Le compilateur Java incorporera des constantes telles que Foo ci-dessus dans le code appelant, c'est-à-dire que someFunc(FooClass.FOO); devient someFunc(5);. Maintenant, si vous recompilez votre bibliothèque mais pas le code d'appel, vous pouvez vous retrouver dans des situations surprenantes. Cela est évité si vous utilisez une fonction - le JIT l'optimisera quand même parfaitement, donc aucune performance réelle ne sera atteinte.

56
Voo

Puisqu’une variable finale ne peut pas être modifiée ultérieurement si vous l’utilisez comme une constante globale, il suffit de la rendre publique, sans getter.

7
Serdar Dogruyol

Getter est inutile ici et sera probablement en ligne par la JVM. Il suffit de s'en tenir à la constante publique.

L'idée derrière l'encapsulation est de protéger les modifications non désirées d'une variable et de masquer la représentation interne. Avec des constantes, cela n'a pas beaucoup de sens.

3

Utilisez les variales en dehors de la classe comme:

public def FOO:Integer = 5; 

Si votre encapsulation n'est pas votre priorité. Sinon, utilisez la deuxième variante pour exposer une méthode et non la variable.

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

Il est également préférable que la maintenance du code ne repose pas sur des variables. Rappelez-vous que "l'optimisation prématurée est la racine de tout le mal".

2
profimedica

La première si le résultat getFood est constant et n'a pas besoin d'être évaluée lors de l'exécution.

0
dash1e

L'avantage d'utiliser setter et getter sur membre est de pouvoir écraser ..__ Ceci n'est pas valable pour les "méthodes" statiques

Il n'y a également aucun moyen de définir des méthodes d'interface statiques.

J'irais avec l'accès au champ

0
stefan bachert

Je resterais avec le getFoo () car il vous permet de changer l'implémentation à l'avenir sans changer le code client. Comme @Tomasz l'a noté, la machine virtuelle Java intégrera probablement votre implémentation actuelle. Vous devez donc payer une pénalité de performances.

0
shams