java - 单例类中 "static final Logger"字段背后的任何原因?

标签 java

我们在所有服务/实用程序类(spring 单例 bean)中都有 Log4j/commons 的“private static final”实例。

我想知道如果 (1) 没有使用它的静态方法 (2) 类是单例,是否有任何合理的情况让这些对象“静态最终”?

我假设在单例对象的静态实例或非静态属性中——这将是 JVM 的同一个老一代对象。另外我认为 JVM 可以很容易地识别一个对象,如果它是私有(private)的并且永远不会出于任何性能目的而改变(如果有的话)。

是否正确?

谢谢!

最佳答案

我个人总是创建一个 private static final Logger LOGGER = LogManager.getLogger(); 作为我创建的任何类(Spring bean、DAO、内部类、域对象等)的第一行). LogManager 充当我的各个 Logger 对象的工厂:

https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/LogManager.html

我非常遵循这一点,以至于我在 Eclipse 下的项目设置实际上会在我创建类时生成该行。

当创建一个记录器时,它引用一个名称或一个类来记录,我上面引用的工厂方法使用包含它的特定类创建记录器。

当您想要调整 log4j 配置时,这种做法会变得非常有用。您可以在不同级别添加高或低合格的记录器或路由到不同的文件。您可以使用该框架做很多事情。

至于private static final,我的推理如下:

  • 因为每个类或子类都有自己的记录器,所以不需要共享或继承。 child 甚至可能处于不同的上层包装中。
  • 因为 Loggers 是类级别类型对象,所以我总是将它们设为静态。它非常清楚地表明它与一个可以存在的对象的实例无关(对于单例,这可能是多余的;但是如果类被重构,有人可能会取消单例模式,而我不会看到明确这是一个类属性的负面影响)。一个额外的好处是静态构造发生在类首次加载时(在它被初始化之前),所以如果我有一个单独的 bean,那么 Logger 也可以在任何类静态方法中使用(不管任何我的 bean 的初始化)。
  • 出于同样的原因,我选择将我的 Final 设置为 Logger,从加载我的类到 JVM 关闭,对于该类来说始终是同一件事;主要是引用那个类下的日志框架。

希望对您有所帮助! :)

关于java - 单例类中 "static final Logger"字段背后的任何原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981135/

相关文章:

java - 拒绝相同号码的重复

java - Intellij 模块依赖。没有发现类定义错误

java - 未指定资源类型(位于 'id' ,值为 '@+id\st' )

java - 在 Java 中接收时 TCP 套接字挂起

java - xml 文件中的 OGM 和 ORM 命名查询

java - Simpledateformat 解析减法而不是加法

java - 如何避免 ResultSet 是 Java 中的关闭异常?

java - hibernate 聚合

java - Hibernate OneToMany 与 OrderBy 生成无效 SQL

java - 给定正数的所有数字的总和