在类中定义Logger实例的最佳方法

时间:2012-05-22 09:47:23

标签: java logging log4j slf4j

我正在查看一些代码并且已经看到很多方法来定义类中的日志实例。其中很少有

protected static final Logger LOG
final Logger LOG

很少有人

protected static final Logger log
final Logger log

这让我感到困惑,因为有些人已将其定义为静态最终版并受到保护,而有些人将其定义为最终版,很少有人在所有大写字母中声明变量,而有些则是正常形式。

任何人都可以了解申报的正确方式或个人选择或项目特定决定的问题吗?

4 个答案:

答案 0 :(得分:2)

我总是去找

private static final Logger logger.

原因是任何扩展此类的类都不应该访问它(因为它将受保护)。扩展类应该定义它自己的记录器。

使用默认值(没有受保护/私有/公共)会更糟糕,因为它允许同一个包或子类中的类访问记录器。

关于使用protected来避免警告的评论 - 这只是懒惰和糟糕的编码。警告是有原因的,它们不会阻止编译。

答案 1 :(得分:1)

最好的方法是在每个类中都没有这样的变量,但在jcabi-log的slf4j周围使用静态实用程序包装器:

Logger.debug(this, "some variable = %s", value);

答案 2 :(得分:0)

我也用

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

使用非静态声明的唯一原因:

private final Logger logger = Logger.getLogger(getClass())

是可以安全地从一个类复制/粘贴到另一个类而不会出错。通常,您复制粘贴或重构您的类,然后在类Logger.getLogger(One.class)中使用Two,这可能会在配置logger进行调试时造成混淆。

答案 3 :(得分:0)

如果我理解正确,你会感到困惑的是:

  1. 第一个示例的变量名称为大写:LOG
  2. 第二个示例的变量名称是小写:log
  3. 在一种情况下,它被简单地声明为final类型变量,而在另一种情况下,它被声明为protected static final类型变量。
  4. 如果是的话,

    LOGlog完全相同。但是,您应该知道程序员通常会以大写形式声明其常量。 Java中的final关键字定义了一个您希望保持不变的变量。因此,编译器不需要以大写形式编写常量,但通常的做法是这样做 - 这就是为什么你看到一些程序员使用小写而其他程序员使用大写;这是一个偏好的问题。

    Java中的protected关键字意味着您希望变量不仅可以通过类的方法访问,还可以访问从其继承的任何子类的任何方法。

    Java中的static关键字在应用于变量/字段时声明这些字段只能由静态方法引用。

    所以,

    protected static final Logger LOG表示LOG将是一个常量变量,不会更改,并且可以通过此类的静态方法访问它,而这些方法又可以由继承自的类的对象访问。这堂课。

    final Logger LOG表示LOG将是一个常量变量且不会更改,并且可以通过PACKAGE中的任何方法访问它 - 无论是否存在继承都无关紧要。

    与其他人一样,我也会选择private static final logger LOG

    请阅读以下有关Java Access Controls的文档,以便更深入地了解正在发生的事情:

    Access Controls in Java

    希望这会对你有所帮助。