在Java中,静态final变量是常量,按照惯例它们应该是大写的。然而,我看到大多数人都用小写来声明记录器,这在PMD中是一种违反。

e.g:

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

只要搜索谷歌或“静态最终记录器”,你会看到这自己。

我们应该使用LOGGER吗?


当前回答

从有效的java,第二版。

The sole exception to the previous rule concerns “constant fields,” whose names should consist of one or more uppercase words separated by the underscore character, for example, VALUES or NEGATIVE_INFINITY. A constant field is a static final field whose value is immutable. If a static final field has a primitive type or an immutable reference type (Item 15), then it is a constant field. For example, enum constants are constant fields. If a static final field has a mutable reference type, it can still be a constant field if the referenced object is immutable.

总之,常量==静态final,如果它是引用(相对于简单类型),则加上不可变性。

查看slf4j记录器, http://www.slf4j.org/api/org/slf4j/Logger.html

它是不可变的。另一方面,JUL记录器是可变的。log4j日志记录器也是可变的。因此,为了正确起见,如果您正在使用log4j或JUL,它应该是“logger”,如果您正在使用slf4j,它应该是logger。

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

当然,这些只是惯例,不是规则。如果您碰巧正在使用slf4j,并且您想要使用“logger”,因为您已经习惯了其他框架中的“logger”,或者如果它更容易输入,或者为了可读性,那么请继续使用。

其他回答

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

我看不出任何严格的理由。我认为这完全取决于你个人的喜好。你公司的编码标准。

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

如果你谷歌这个,你可能会发现在某些情况下,记录器没有被定义为静态final。再快速复制粘贴一下,也许就能解释了。

我们在所有代码中都使用了LOGGER,这与我们的命名约定相对应(CheckStyle对此很满意)。


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

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

日志记录器被注释掉,因为最初我们不需要它。但是如果我们以后需要它,我们只需取消注释它。

然后,在代码中,我们使用期望该记录器出现的代码模板。 使用try-catch模板的示例:

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

我们有更多的模板使用它。

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

常量通常是大写的。

然而,记录器不应该是静态的,而是在使用slf4j facade时查找包含类的每个“新”。这避免了web容器中一些讨厌的类加载器问题,而且它允许记录器框架根据调用上下文做一些特殊的事情。

从有效的java,第二版。

The sole exception to the previous rule concerns “constant fields,” whose names should consist of one or more uppercase words separated by the underscore character, for example, VALUES or NEGATIVE_INFINITY. A constant field is a static final field whose value is immutable. If a static final field has a primitive type or an immutable reference type (Item 15), then it is a constant field. For example, enum constants are constant fields. If a static final field has a mutable reference type, it can still be a constant field if the referenced object is immutable.

总之,常量==静态final,如果它是引用(相对于简单类型),则加上不可变性。

查看slf4j记录器, http://www.slf4j.org/api/org/slf4j/Logger.html

它是不可变的。另一方面,JUL记录器是可变的。log4j日志记录器也是可变的。因此,为了正确起见,如果您正在使用log4j或JUL,它应该是“logger”,如果您正在使用slf4j,它应该是logger。

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

当然,这些只是惯例,不是规则。如果您碰巧正在使用slf4j,并且您想要使用“logger”,因为您已经习惯了其他框架中的“logger”,或者如果它更容易输入,或者为了可读性,那么请继续使用。

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

Sun Java中的约定是大写的公共静态常量。显然,记录器不是常量,而是表示一个可变的东西(否则就没有必要调用它的方法,希望发生一些事情);对于非常数终场没有特定的标准。