【问题标题】:Best way to define Logger instance in the class在类中定义 Logger 实例的最佳方法
【发布时间】:2012-05-22 09:47:23
【问题描述】:

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

protected static final Logger LOG
final Logger LOG

很少有

protected static final Logger log
final Logger log

这让我很困惑,因为有些人将其定义为静态 final 并受保护,而有些人将其定义为仅 final,很少有人将变量声明为全部大写,有些是正常形式。

任何人都知道什么是正确的申报方式,还是个人选择或项目特定决定的问题?

【问题讨论】:

标签: java logging log4j slf4j


【解决方案1】:

我总是喜欢

private static final Logger logger.

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我也用过

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        如果是这样,

        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 in Java

        希望对你有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-18
          • 2013-11-21
          相关资源
          最近更新 更多