Une façon idéale d'organiser les constantes de Java

nous avons d'énormes projets basés sur un ancien JDK 1.4. Nous avons migré l'application web vers JDK 1.6 mais beaucoup de pratiques inefficaces et de mauvaise conception existent encore dans le code.

Sur le point douloureux énorme classes java 2500+ lignes de code dans un seul fichier java. Tant de dossiers comme ceux-ci.

dans une tentative de reformuler les classes que j'avais commencées en enlevant les constantes et en les mettant dans des constantes différentes.fichier java. mais comme il y a beaucoup de constantes à travers l'application, le fichier des constantes risque de prendre des proportions gigantesques.

j'apprécierais des commentaires sur la stratégie que les développeurs adoptent pour garder le code propre et maintenable.

15
demandé sur feeling abused and harassed 2012-02-28 20:04:46

8 réponses

Conservez vos constantes dans la classe à laquelle elles sont liées, ne vous sentez pas obligé de les extraire. Il peut nettoyer le code de la classe, mais mélanger des constantes sans rapport dans un fichier n'est pas une amélioration.

Garder les choses liées ensemble.

et vous pouvez aussi les convertir en Enum lorsque cela est possible/utile (mais cela peut nécessiter un remaniement).

15
répondu Matthieu Napoli 2012-02-28 17:13:49

mettre toutes les constantes dans un seul fichier est une idée terrible! Surtout l'anti-pattern de la constante uber où toutes les constantes sont dans un Interface que chaque classe a implement. 10 façons d'être dimanche terrible! C'était une mauvaise idée quand les gens ont commencé à le faire au début des années 1990 avant Java! C'est certainement une mauvaise idée en 2012!

cela signifie que vous mélangez beaucoup d'informations non liées et que vous créez des dépendances inutiles chaque fois que vous importez ces constantes uber fichier. Les choses qui vont ensemble doivent être ensemble dans un Enum ou au moins dans le Class qui les utilise comme arguments à ses méthodes de sorte que quand ils sont changés vous savez faire une analyse d'impact facilement.

Imaginez Color constantes mélangé avec DaysOfTheWeek constantes mélangées avec d'autres constantes de domaine d'affaires et il y aura des centaines sinon des milliers de ces choses dans un seul fichier. Comment cela peut-il être considéré comme une bonne idée? Dans chaque cas non artificiel, un Enum c'est un public inner membre d'un Class est une meilleure solution.

cela signifie aussi que vous avez un seul espace de noms plat pour essayer de créer des noms qui n'entrent pas en conflit, alors ils ne sont pas évidents à quoi ils appartiennent et comment ils devraient être utilisés. Ce n'est jamais un exercice positif.

lors de la conception et de la refonte, vous devez toujours:

viser une forte cohésion, cela signifie garder les choses le plus près possible.

viser couplage lâche cela signifie ne pas laisser à l'onu choses fuite dans d'autres relatifs à l'onu étendues.

S'efforcer d'auto-documenter le code maintenable, des douzaines ou des centaines de private static final String/int des déclarations toutes mélangées ensemble ne correspondent pas à cette définition selon la norme de quiconque!

en 2012 les constantes de style C sont une mauvaise solution quand vous avez maintenant Enum autant que possible. Enum est de type sécurisé et peuvent avoir d'autres attributs et des propriétés et des comportements attaché à rendre intelligent. C'est le chemin pour aller vers le bas.

10
répondu feeling abused and harassed 2012-02-28 19:55:58

il suffit de le mettre constantes dans un Constant.java le fichier ne fait pas de sens à mon avis (il suffit de déplacer le problème). Mais parfois, j'utilise les regrouper, pour effacer les choses et d'utiliser plusieurs fichiers pour les regrouper : DatabaseConstants.java,GraphicConstants.java et ainsi de suite... et bien sûr, utiliser les énumérations peuvent être utiles (et de bonnes pratiques).

edit : pour être précis, je travaille en fait avec L'application Java ME, donc c'est juste un moyen d '"imiter" les énums que je ne peux pas avoir, avec un "vocabulaire contrôlé" dans les classes abstraites (I manquer toutes les fonctionnalités Java EE...)

2
répondu Vinze 2012-03-03 10:36:49

j'aimerais partager un modèle de conception pour les constantes que j'ai vu il y a quelques années qui peut peut-être aider.

commencez par créer un fichier BaseConstant. Cela va contenir toutes vos constantes globales que tous les paquets peuvent utiliser.

maintenant dans chaque sous-paquet de votre application, créez un fichier de constantes qui ne sera relié qu'au sous-paquet . Donc, si vous avez eu . un sous-paquet appelé Login ne met que des constantes liées à login. Mais la clé est de s'étendre hors des BaseConstants. de cette façon vous pouvez voir toutes les constantes globales dans le chooser IDE, mais quand vous ouvrez le fichier, vous ne voyez que les constantes de votre paquet. cela étant dit, je pense que les fichiers constants peuvent obtenir des valeurs très lourdes et dupliquées et difficiles à lire.

Voici ce que je veux dire ..

public class BaseConstants{

public static final String GLOBAL1= "GLOBAL string"; 

public static final String GLOBAL2= "another GLOBAL string"; 
}

maintenant dans tous vos autres paquets créez un fichier comme ceci:

class MyPackageConstants extends BaseConstants{

public static final String LOCAL1 = "local String"
public static final String LOCAL2= "ANOTHER LOCAL string"; 
}

dans votre IDE quand vous tapez " MyPackageConstants."vous devriez voir toutes les constantes pour l'ensemble de l'application.

1
répondu j2emanue 2017-06-09 10:45:56

pour quelqu'un qui visite cette page.

si vous ne voulez pas maintenir plusieurs fichiers constants, ci-dessous est la meilleure façon d'organiser.

public interface Constants {
    public static final String CREATE_USER = "createUser";
    // Nested Interface.
    public interface ProjectConstants {
        public static final String CREATE_PROJECT = "createProject";
        public static final String INVALID_SESSION = "Invalid Session";
        // As you know they are implicity public static final.
    }
}// Accessed as: 
Constants.ProjectConstants.CREATE_PROJECT

Mises à jour:

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}
1
répondu Jajikanth pydimarla 2018-07-24 14:55:08

Je n'ai jamais entendu parler de mettre toutes les constantes dans un seul fichier java. La meilleure façon est de mettre les constantes accossier avec les classes en elles-mêmes, mais les nommer avec la lettre majuscule et souligne comme celui-ci: EXAMPLE_CONSTANT

0
répondu Gio 2012-02-28 16:08:25

avez-vous essayé D'utiliser Enums pour toutes vos constantes? On m'a dit que C'était la méthode préférée depuis Java 1.5.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html

0
répondu Joe R. 2012-02-28 16:10:37

je pense que si vous avez plusieurs fichiers java plus de 2500 LOCs, la décision où mettre les constantes devrait être le moindre de vos problèmes. Vous devez vous faire une idée claire de la façon dont le système restructuré ressemblera. Ceci est probablement beaucoup plus difficile que de décider où coller les constantes et d'autres considérations syntaxiques mais doit être fait d'abord néanmoins.

-1
répondu David Soroko 2012-02-28 17:44:28