应该在“大写”中声明“静态最终logging器”吗?

在Java中,静态最终variables是常量,惯例是它们应该是大写的。 但是,我看到大多数人都以小写字母的forms声明了违规发生在PMD中的logging器 。

例如:

private static final Logger logger = Logger.getLogger(MyClass.class); 

只要search谷歌或SO “静态最终logging器”,你会看到这一点。

我们应该使用LOGGER吗?

logging器的引用不是一个常数,而是一个最终的引用,不应该是大写的。 一个常量VALUE应该是大写的。

 private static final Logger logger = Logger.getLogger(MyClass.class); private static final double MY_CONSTANT = 0.0; 

为了给crunchdog的答案增加更多价值, Java编码风格指南在第3.3节“字段命名”中说明了这一点

用作常量的字段名称应全部大写,下划线用于分隔单词。 以下被认为是常数:

  1. 所有static final基元types(请记住, 所有接口字段本质上是static final )。
  2. 所有static final对象引用types永远不会跟着“ . ”(点)。
  3. 所有永远不会跟着“ [ ”(点)。

例子:

 MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME 

按照这个约定, logger是一个static final对象引用,如第2点所述,但是因为每次使用它时都会紧跟“ . ”,所以不能将其视为常量,因此应该是小写。

从有效的Java,第二版,

前一个规则的唯一例外是“常量字段”,其名称应由一个或多个由下划线字符分隔的大写字母组成,例如VALUES或NEGATIVE_INFINITY。 常量字段是一个静态的最终字段,其值是不可变的 。 如果一个静态final字段有一个基本types或一个不可变引用types(Item 15),那么它是一个常量字段。 例如,枚举常量是常量字段。 如果一个静态final字段有一个可变的引用types,如果被引用的对象是不可变的,它仍然可以是一个常量字段。

总之,常量==静态最终,加上,如果它是一个参考(对简单types),不变性。

看一下slf4jlogging器, http: //www.slf4j.org/api/org/slf4j/Logger.html

它是不可改变的。 另一方面,JULlogging器是可变的。 log4jlogging器也是可变的。 因此,如果你使用的是log4j或者JUL,它应该是“logger”,如果你使用的是slf4j,它应该是LOGGER。

请注意,上面链接的slf4j javadocs页面有一个用户“logger”而不是“LOGGER”的例子。

这当然只是公约而不是规则。 如果你恰好在使用slf4j,并且你想使用“logger”,因为你已经习惯了其他的框架,或者为了便于input,或者为了便于阅读,请继续。

我喜欢Google( Google Java Style )

每个常量都是一个静态final字段,但并不是所有静态final字段都是常量。 在select不变的情况下,考虑这个领域是否真的感觉像一个常量。 例如,如果任何一个实例的可观察状态都可以改变,那么它几乎肯定不是一个常量。 仅仅意图不改变对象通常是不够的。

例子:

 // 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"}; 

如果您使用的是自动化工具来检查您的编码标准,并且违反了标准,那么它或标准应该是固定的。 如果您使用外部标准,请修复代码。

Sun Java中的约定对于公共静态常量是大写的。 显然,logging器并不是一成不变的,而是代表着一个可变的东西(否则就没有任何一点调用的方法,希望会发生什么)。 对于非常量最终字段没有具体的标准。

如果你谷歌这个,你可能会发现,在某些情况下,logging器没有被定义为静态最终。 添加一些快速的复制粘贴到这个,这可能解释它。

我们在我们所有的代码中都使用了LOGGER ,这和我们的命名约定是一致的(我们的CheckStyle也很满意)。


我们更进一步,利用Eclipse中严格的命名约定。 我们创build一个新的类,其代码模板为:

  // private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class); 

logging器被注释掉,因为最初我们不需要它。 但是,如果我们以后需要,我们只是取消它的评论。

然后在代码中,我们使用期望这个logging器出现的代码模板。 try-catch模板的例子:

  try { ${cursor} or some other template } catch (Exception t) { LOGGER.error("${methodName} ${method parameters}", t); } 

我们有几个使用它的模板。

严格的约定使我们能够更高效地使用代码模板

我个人认为它看起来很大,大写。 而且,因为它是一个与类行为没有直接关系的类,所以在使用logger而不是LOGGER ,我看不出什么大问题。 但是,如果你要严格迂腐,那么使用LOGGER

不要忘记,PMD将尊重评论

 // NOPMD 

在里面。 这将导致PMD跳过检查线,这将允许您select任何你想要的风格。

通常常量是大写的。

但是,日志logging器不应该是静态的,如果使用slf4j外观,则会查找包含类的每个“新”。 这避免了一些讨厌的类加载器问题,尤其是在Web容器中,它允许logging器框架根据调用上下文来做特殊的事情。

不必要。 阅读 – 命名约定

概要:声明类常量和ANSI常量的variables的名称应该全部大写,并用下划线(“_”)分隔的单词。

如果你的编码标准 – 如果有的话 – 说它应该是大写,那么是的。

我没有看到任何一种方式的严格的理由。 我认为这完全取决于你的个人喜好。 你公司的编码标准。

顺便说一句:我更喜欢“LOGGER”;-)