class 中记录器的位置应该是什么?

What should be the position of logger in the class?

正在与朋友讨论记录器的位置。根据干净代码 static final 属性必须位于 class 之上。我朋友坚持要留着,如下图:

public class SomeDummyClass {
    private static final String PREFIX = "xxx";
    private static final String SUFFIX = "yyy";
    private static final Logger LOG = LoggerFactory.getLogger(SomeDummyClass.class);
    // other implementations
}

这是我的建议:

public class SomeDummyClass {
    private static final Logger LOG = LoggerFactory.getLogger(SomeDummyClass.class);
    private static final String PREFIX = "xxx";
    private static final String SUFFIX = "yyy";
    // other implementations
}

我的观点是让代码乍一看更具可读性。我知道没有将 log 定义置于一切之上的书面规则,但我想听听您的经验和想法。

最常见的方法是将其放在最上面一行。此外,logger 不是常量,它是一个正在执行副作用(写入日志)的对象,因此不应完全大写。

public class SomeDummyClass {
    private static final Logger logger = LoggerFactory.getLogger(SomeDummyClass.class);

    private static final String PREFIX = "xxx";
    private static final String SUFFIX = "yyy";
    // other implementations
}

以下所有示例都遵循相同的约定:

https://www.baeldung.com/slf4j-with-log4j2-logback

https://www.stubbornjava.com/posts/logging-in-java-with-slf4j-and-logback

https://www.mkyong.com/spring-mvc/spring-mvc-logback-slf4j-example/

https://www.javacodegeeks.com/2012/04/using-slf4j-with-logback-tutorial.html

Clean Code 还告诉您尽可能遵循通用约定,以尽量减少新开发人员理解您的代码并浏览代码所需的时间和精力.所以在这种情况下,鉴于全球惯例是以这种方式放置记录器,我会遵守它。

我倾向于先在顶部声明所有 class 通用的变量,然后是 class 特定的变量。因此,将 LOG 放在顶部有助于提高可读性,因为 classes 将更加标准。