Aujourd'hui, j'ai eu une discussion avec un collègue sur la dénomination des final
champs dans les classes Java.
Dans son opionion, les final
champs doivent également être considérés comme des constantes car leurs valeurs ne changeront pas après la création de l'instance.
Cela conduirait à la convention de dénomination suivante pour les final
champs:
public class Foo {
private static final String BLA_BLA = "bla";
private final String BAR_BATZ;
...
}
À mon avis, seuls les static final
champs doivent être considérés comme des constantes tandis que les champs qui le sont final
doivent suivre la convention de dénomination camelCase habituelle.
public class Foo {
private static final String BLA = "bla";
private final String barBatz;
...
}
Maintenant, je suis un peu incertain car il est un programmeur beaucoup plus expérimenté que moi et je suis généralement d'accord avec ses opinions et le considère comme un très bon développeur.
Des commentaires à ce sujet?
...
était censé symboliser tout constructeur possible qui définit lefinal
champ, mais ce n'est évidemment pas possible pour lestatic final
champ.static { }
blocs qui peuvent être utilisés pour définir des champs statiques dans une classe une fois lorsque la classe est chargée. Associé Travailler avec un constructeur statique en Java .Réponses:
Sun (et maintenant Oracle) a maintenu un document intitulé Conventions de code pour le langage de programmation Java . La dernière mise à jour a eu lieu en 1999, mais l'essence de la ligne de guide de style persiste.
Le chapitre 9 couvre les conventions de dénomination.
Pour un type d'identifiant de «constantes»:
Les exemples donnés:
Dans un document plus récent - son glissé là-dedans. From Variables (Les tutoriels Java> Apprendre le langage Java> Bases du langage :
De nombreux analyseurs statiques pour Java cherchent à appliquer cela. Par exemple, le style de contrôle applique:
Cela se résume vraiment aux conventions de la communauté écrivant le code ... et idéalement le gardant le même.
Les exemples ci-dessus sont donnés comme
static final
ceux qui sont probablement dérivés des conventions C pour#define
- qui, comme C, sont remplacées dans le code lors de la compilation plutôt qu'à l'exécution.La question qui devrait alors être posée est "est-ce que cela se comporte comme une constante? Ou est-ce comme un champ à écriture unique?" - puis suivre les conventions en conséquence. Le test décisif pour une telle question serait "Si vous étalonniez l'objet, incluriez-vous le champ final?" Si la réponse est qu'il s'agit d'une constante, traitez-la comme telle (et ne la sérialisez pas). D'un autre côté, si cela fait partie de l'état de l'objet qui devrait être sérialisé, alors ce n'est pas une constante.
Quoi qu'il en soit, il est important de s'en tenir au style de code, qu'il soit juste ou faux. Les problèmes les plus graves surgissent de conventions incohérentes dans un projet plutôt que simplement quelque chose qui choque l'œil. Envisagez d'obtenir des outils d'analyse statique et de les configurer pour maintenir la cohérence.
la source
MinWidth
au lieu deMIN_WIDTH
. Une autre question est: qu'en est-il des enregistreurs finaux statiques? Les appelez-vousLOG
/LOGGER
oulog
/logger
. Personnellement,log
semble mieux en ligne avec le code, mais quand l'incohérence est-elle acceptable, le cas échéant?BAR_BATZ
n'est pas une constante dans cet exemple. Les constructeurs deFoo
peuvent le définir sur différentes valeurs au niveau de l'objet. Par exemplela source