371 votes

Quelle est la meilleure façon d'implémenter les constantes en Java ?

J'ai vu des exemples comme celui-ci :

public class MaxSeconds {
   public static final int MAX_SECONDS = 25;
}

et j'ai supposé que je pouvais avoir une classe Constants pour envelopper les constantes, en les déclarant static final. Je ne connais pratiquement rien à Java et je me demande si c'est la meilleure façon de créer des constantes.

1 votes

Juste pour ajouter constantes java : public/privé

0 votes

403voto

jjnguy Points 62123

C'est parfaitement acceptable, probablement même la norme.

(public/private) static final TYPE NAME = VALUE;

donde TYPE est le type, NAME est le nom en majuscules avec des caractères de soulignement pour les espaces, et VALUE est la valeur constante ;

Je recommande vivement de NE PAS placer vos constantes dans leurs propres classes ou interfaces.

Remarque : les variables déclarées finales et mutables peuvent toujours être modifiées ; cependant, la variable ne peut jamais pointer vers un objet différent.

Par exemple :

public static final Point ORIGIN = new Point(0,0);

public static void main(String[] args){

    ORIGIN.x = 3;

}

C'est légal et ORIGIN serait alors un point à (3, 0).

19 votes

Vous pouvez même "importer static MaxSeconds.MAX_SECONDS ;" pour ne pas avoir à l'épeler MaxSeconds.MAX_SECONDS.

23 votes

Le commentaire précédent sur l'importation statique ne s'applique qu'à Java 5+. Certains pensent que le raccourci ne vaut pas la confusion possible quant à l'origine de la constante, lorsque l'on lit un long code, MaxSeconds.MAX_SECONDS peut être plus facile à suivre que de remonter et de regarder les importations.

5 votes

Parce que vous pouvez changer l'objet comme jjnguy l'a montré, il est préférable que vos constantes soient des objets immuables ou simplement des primitives/chaînes.

234voto

MetroidFan2002 Points 11413

Je déconseille fortement d'avoir une seule classe de constantes. Cela peut sembler une bonne idée sur le moment, mais lorsque les développeurs refusent de documenter les constantes et que la classe se développe pour englober plus de 500 constantes qui n'ont rien à voir les unes avec les autres (étant liées à des aspects totalement différents de l'application), le fichier des constantes devient généralement complètement illisible. À la place :

  • Si vous avez accès à Java 5+, utilisez les enums pour définir vos constantes spécifiques pour une zone d'application. Toutes les parties du domaine d'application doivent faire référence aux enums, et non aux valeurs constantes, pour ces constantes. Vous pouvez déclarer un enum de la même manière que vous déclarez une classe. Les enums sont peut-être la fonctionnalité la plus (et, sans doute, la seule) utile de Java 5+.
  • Si vous avez des constantes qui ne sont valables que pour une classe particulière ou l'une de ses sous-classes, déclarez-les comme étant protégées ou publiques et placez-les dans la classe supérieure de la hiérarchie. De cette façon, les sous-classes peuvent accéder aux valeurs de ces constantes (et si d'autres classes y accèdent via public, les constantes ne sont pas uniquement valables pour une classe particulière... ce qui signifie que les classes externes utilisant cette constante peuvent être trop étroitement liées à la classe contenant la constante).
  • Si vous avez une interface dont le comportement est défini, mais que les valeurs retournées ou les valeurs des arguments doivent être particulières, il est parfaitement acceptable de définir des constantes sur cette interface afin que les autres implémenteurs y aient accès. Cependant, évitez de créer une interface juste pour contenir des constantes : elle peut devenir aussi mauvaise qu'une classe créée juste pour contenir des constantes.

12 votes

Tout à fait d'accord... cela peut être documenté comme un anti-modèle classique pour les grands projets.

30 votes

Hors sujet, mais... Les génériques ne sont certainement pas parfaits, mais je pense que l'on peut très bien justifier leur utilité en tant que fonctionnalité de Java 5 :)

0 votes

Avec tout le respect que je dois à votre opinion, il s'agit d'une opinion et non d'une réponse, elle devrait donc être publiée en tant que commentaire, en l'état actuel des choses. Je sais que c'est vieux mais ça ne change rien.

120voto

Marcio Aguiar Points 6715

Il s'agit d'un MAUVAISE PRATIQUE d'utiliser des interfaces uniquement pour contenir des constantes (nommées modèle d'interface constant par Josh Bloch). Voici ce que Josh conseille :

Si les constantes sont fortement liées à une classe ou une interface existante, vous devez les ajouter à la classe ou à l'interface l'interface. Par exemple, toutes les constantes classes de primitives numériques encadrées, telles que Integer et Double, exportent les constantes MIN_VALUE et MAX_VALUE. Si vous consultez le site les constantes sont mieux considérées comme membres d'un type énuméré, vous devez les exporter avec un enum type. Sinon, vous devez exporter le constantes avec une classe classe utilitaire non instable.

Exemple :

// Constant utility class
package com.effectivejava.science;
public class PhysicalConstants {
    private PhysicalConstants() { }  // Prevents instantiation

    public static final double AVOGADROS_NUMBER   = 6.02214199e23;
    public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    public static final double ELECTRON_MASS      = 9.10938188e-31;
}

À propos de la convention de dénomination :

Par convention, ces champs ont pour nom composés de lettres majuscules, avec mots séparés par des caractères de soulignement. Il est essentiel que ces champs contiennent des valeurs primitives ou des références à des objets immuables.

23 votes

Si vous qualifiez quelque chose de mauvaise pratique, vous devriez peut-être expliquer pourquoi vous pensez que c'est le cas ?

14 votes

Il s'agit d'un vieux post, mais il vaut mieux utiliser abstract pour la classe au lieu du constructeur privé.

0 votes

@XtremeBiker veuillez expliquer ; [citation-needed] .

36voto

shelfoo Points 1285

Dans Effective Java (2e édition), il est recommandé d'utiliser les enums au lieu des ints statiques pour les constantes.

Il y a un bon article sur les enums en Java ici : http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

Notez qu'à la fin de cet article, la question posée est la suivante :

Alors, quand faut-il utiliser les enums ?

Avec une réponse de :

Chaque fois que vous avez besoin d'un ensemble fixe de constantes

21voto

Évitez simplement d'utiliser une interface :

public interface MyConstants {
    String CONSTANT_ONE = "foo";
}

public class NeddsConstant implements MyConstants {

}

C'est tentant, mais cela viole l'encapsulation et brouille la distinction des définitions de classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X