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

e.g:

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

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

我们应该使用LOGGER吗?


当前回答

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

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

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

其他回答

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

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

如果你谷歌这个,你可能会发现在某些情况下,记录器没有被定义为静态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);
    }

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

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

我喜欢谷歌的做法(谷歌Java风格)

每个常量都是一个静态最终字段,但并不是所有的静态最终字段都是常量。在选择常数情况之前,考虑场是否真的像常数。例如,如果该实例的任何可观察状态可以改变,那么它几乎肯定不是常量。仅仅打算永远不改变对象通常是不够的。

例子:

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

记录器引用不是一个常量,而是一个最终引用,不应该是大写的。常量值应该是大写的。

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

private static final double MY_CONSTANT = 0.0;

从有效的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”,或者如果它更容易输入,或者为了可读性,那么请继续使用。