是否应该将记录器声明为静态?通常,我已经看到记录器的两种类型的声明:
受保护的日志日志=新的Log4JLogger(aClass.class);
要么
专用静态日志log = new Log4JLogger(aClass.class);
应该使用哪一个?两者的优缺点是什么?
非静态形式的优点是,您可以像下面的(抽象)基类中声明它,而不必担心会使用正确的类名:
protected Log log = new Log4JLogger(getClass());
但是,其缺点显然是将为该类的每个实例创建一个全新的记录器实例。这本身可能并不昂贵,但会增加大量开销。如果您想避免这种情况,请改用static
表格。但是它的缺点是,您必须在每个单独的类中声明它,并在每个类中都要注意在记录器的构造过程中使用了正确的类名,因为getClass()
不能在静态上下文中使用它。但是,在普通的IDE中,您可以为此创建一个自动完成模板。例如logger
+
ctrl+space
。
另一方面,如果您通过工厂获得记录器,而该记录器又可能会缓存已经实例化的记录器,则使用非静态形式不会增加太多开销。例如Log4j为此具有一个LogManager
。
protected Log log = LogManager.getLogger(getClass());
问题内容: 在Java中,静态最终变量是常量,并且约定应使用大写形式。但是,我已经看到大多数人以小写形式声明记录器,这在PMD中是违反的。 例如: 只需在Google或SO中搜索“静态最终记录器”,您便会自己看到它。 我们应该改用LOGGER吗? 问题答案: 记录器引用不是常量,而是最终引用,并且不应大写。常数VALUE应该为大写。
问题内容: 可以从许多线程访问类。在这种情况下,必须是记录器还是最终的和静态的?谢谢。 问题答案: 所有主要的Java日志记录程序包(等)都是同步的并且是线程安全的。即使从多个线程调用该类,每个类的记录器的标准模式也可以。
首先让我说,“记录器”是指任何一类负责向用户或程序员报告诊断或进度信息的对象。根据这个定义,“记录器”将包括图形用户界面上的反馈,如进度条。 我们一再被告知要避免全局状态,尤其是全局可变状态(GMS)。因为伐木者天生是可变的,所以我最近试图让我的伐木者“不是全球性的”。我尝试了各种策略(比如通过构造函数向记录器注入引用)。我终于意识到,所有的方法都是把口红贴在猪身上。 日志记录器必须是所有类(或至
因此,我研究了有关在Java中登录的最佳实践(slf4j、log4j、logback等),看起来,库之间已经同意了日志API应该是什么样子。我一直在读的建议是这样的代码,您可以为每个类创建一个记录器: 现在,我并没有真正得到为不同的类使用不同的记录器的好处。为什么Logger类中的info/debug/etc.方法不是静态的? 请不要给出类似“好处是您可以根据类配置日志记录器。例如,您可以将单个类
问题内容: 假设我有一个要实例化的类。我在类中有几个私有的“帮助器”方法,它们不需要访问任何类成员,而仅对它们的参数进行操作,并返回结果。 有没有指定任何特别的原因,并为静态方法-或任何特别的理由不? 将它们设置为非静态无疑是最容易的,即使它们可以肯定是静态的而不会引起任何问题。 问题答案: 我更喜欢这样的帮助方法; 这将使读者清楚地知道他们不会修改对象的状态。我的IDE还将以斜体显示对静态方
这将打印a.a=50 但是,如果我将更改为,那么我可以如何访问该变量呢?