Un "Logger final statique" doit-il être déclaré en majuscules?
en Java, les variables finales statiques sont des constantes et la convention est qu'elles doivent être en majuscules. Cependant, j'ai vu que la plupart des gens déclarent des bûcherons en minuscules ce qui apparaît comme une violation dans PMD .
E. g:
private static final Logger logger = Logger.getLogger(MyClass.class);
il suffit de chercher google ou DONC "static final logger" et vous verrez par vous-même.
devrait on utilise LOGGER à la place?
10 réponses
la référence de l'enregistreur n'est pas une constante, mais une référence finale, et ne doit pas être en majuscule. Une valeur constante doit être en majuscule.
private static final Logger logger = Logger.getLogger(MyClass.class);
private static final double MY_CONSTANT = 0.0;
pour ajouter plus de valeur à la réponse de crunchdog, le Java Coding Style Guide indique ceci au paragraphe 3.3 appellation du champ
les noms des champs utilisés comme constantes devraient être tous en majuscules, avec des soulignements séparant les mots. Les éléments suivants sont considérés comme des constantes:
- tous
static final
types primitifs (se rappeler que tous Les champs d'interface sont intrinsèquementstatic final
).- Tous
static final
la référence d'objet types qui ne sont jamais suivis de " de.
" (point).- tous les
static final
tableaux qui ne sont jamais suivis par"[
" (point).exemples:
MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
conformément à la présente convention, logger
est une référence d'objet static final
comme indiqué au point 2, mais parce qu'il est suivi de .
" chaque fois que vous l'utilisez, il ne peut pas être considéré comme une constante et donc devrait être cas inférieur.
From effective java,2e éd.,
La seule exception à la règle précédente préoccupations "champs constants," dont les noms doivent être composés d'un ou de plusieurs mots en majuscules séparés par le caractère underscore, par exemple, VALUES ou NEGATIVE_INFINITY. A le champ constant est un champ final statique dont la valeur est immuable . Si un le champ final statique a un type primitif ou un type de référence immuable (Article 15), alors c'est un à champ constant. Par exemple, une énumération des constantes sont des champs constants. Si un champ final statique a une référence mutable le type, il peut encore être un champ constant si l'objet référencé est immuable.
En résumé, constant == static final, et en plus, si c'est une référence (par opposition à un type simple), l'immuabilité.
en regardant le logger slf4j, http://www.slf4j.org/api/org/slf4j/Logger.html
It est immuable. D'un autre côté, le Jul logger est mutable. Le logger log4j est également mutable. Donc, pour être correct, si vous utilisez log4j ou JUL, il devrait être "logger", et si vous utilisez slf4j, il devrait être LOGGER.
notez que la page javadocs slf4j liée ci-dessus a un exemple où ils utilisent "logger", pas "LOGGER".
ce ne sont bien sûr que des conventions et non des règles. Si vous utilisez slf4j et que vous voulez utiliser "logger" parce que vous êtes utilisé à celui d'autres cadres, ou si elle est plus facile à taper, ou pour la lisibilité, aller de l'avant.
j'aime Google de prendre sur elle ( Google Java Style )
chaque constante est un champ final statique, mais tous les champs finaux statiques ne sont pas des constantes. Avant de choisir cas constant, examiner si le domaine se sent vraiment comme une constante. Par exemple, si l'un quelconque de l'état observable de cette instance peut changer, ce n'est presque certainement pas une constante. La simple intention de ne jamais muter l'objet n'est généralement pas suffisante.
exemples:
// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }
// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
Si vous utilisez un outil automatisé pour vérifier vos normes de codage et il viole ces normes, alors il ou les normes doivent être corrigés. Si vous utilisez un standard externe, fixez le code.
la convention dans Sun Java est uppercase pour les constantes statiques publiques. Évidemment un logger n'est pas constant, mais représente une chose mutable (sinon il n'y aurait pas de méthode d'appel de point sur elle dans l'espoir que quelque chose se produira ); il n'y a pas de norme spécifique pour les champs finaux non constants.
si vous utilisez google à cette fin, vous pourriez constater que, dans certains cas, les loggers ne sont pas définis comme Final statique. Ajoutez un copy-n-paste rapide à ceci, et ceci pourrait l'expliquer.
nous utilisons LOGGER dans tout notre code, et cela correspond à notre convention de nommage (et notre CheckStyle en est satisfait).
nous allons même plus loin, en profitant de la stricte convention de nommage dans Eclipse. Nous allons créer un nouveau classe avec un modèle de code de :
// private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);
le logger est commenté, car au départ nous n'en avons pas besoin. Mais si on en a besoin plus tard, on le décommente.
puis dans le code, nous utilisons des gabarits de code qui s'attendent à ce que cet enregistreur soit présent. Exemple avec le modèle try-catch:
try {
${cursor} or some other template
} catch (Exception t) {
LOGGER.error("${methodName} ${method parameters}", t);
}
nous avons quelques modèles supplémentaires qui l'utilisent.
la Convention stricte nous permettent d'être plus productif et cohérent avec les modèles de code .
personnellement, je pense qu'il est vraiment grand en majuscules. De plus, comme il s'agit d'une classe qui n'est pas directement liée au comportement de la classe, Je ne vois pas de problème majeur à utiliser logger
au lieu de LOGGER
. Mais si vous devez être strictement pédant, alors utilisez LOGGER
.
N'oubliez pas que PMD respectera un commentaire avec
// NOPMD
dedans. Cela va amener PMD à sauter la ligne de ses vérifications, ce qui vous permettra de choisir le style que vous voulez.
les constantes sont habituellement en majuscules.
Bûcherons, cependant, ne doit pas être statique, mais leva les yeux pour tous les "nouveaux" de la classe conteneur si vous utilisez le slf4j façade. Cela évite certains problèmes de classloader dans les conteneurs notamment web, en plus de permettre au framework logger de faire des choses spéciales en fonction du contexte d'invocation.
si vos normes de codage - si vous en avez - disent qu'elles devraient être en majuscules, alors oui.
Je ne vois pas de raison stricte pour l'une ou l'autre. Je pense que ça dépend totalement de tes goûts personnels. votre entreprise des normes de codage.
BTW: I prefer "LOGGER" ; -)