单身人士课程中“静态最终记录器”字段背后的任何原因?

时间:2015-05-01 03:09:17

标签: java

我们在所有服务/实用程序类(spring singleton beans)中记录了Log4j / commons的“private static final”实例。

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

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

这是对的吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

SQLFiddle

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

创建记录器时,它引用要登录的名称或类,上面引用的工厂方法创建了包含它的特定类的记录器。

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

至于私人静态决赛,我的理由如下:

  • 因为每个类或子类都有自己的Logger,所以不需要共享或继承。儿童甚至可能处于不同的上层包裹中。
  • 因为Loggers是类级别对象,所以我总是将它们设为静态。它非常清楚地表明它与一个物体的实例无关(对于单身人士来说,这可能是多余的;但如果课程被重构,有人可能会废除单身人士模式而且我不会; t看到否定这是一个类属性是否定的。一个额外的好处是静态构造在类首次加载时(在它初始化之前)发生,所以如果我有一个单独的bean,那么Logger也可以在任何类中使用静态方法(无论是否我的bean的初始化)。
  • 我选择以同样的理由让我的决赛,Logger,从我的班级加载到JVM关闭时,对于那个班级总是同样的事情;主要是,它引用了该类下的日志框架。

希望这有帮助! :)

答案 1 :(得分:1)

制作记录器staticfinal是一种常见的习惯用法,并且很容易开始进行代码审核。"标准"记录器节出现了。我认为没有理由偏离单身中的成语,但你是正确的,它只会在单身人士的情况下创建一个logger