Java记录器:静态块初始化或变量声明中的初始化


15

目前,我正在通过以下方式在项目中使用logger:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

我获得了使用静态块初始化logger变量的代码审查。有人告诉我在声明语句本身中初始化logger变量。

private static final Logger LOGGER = Logger.getLogger();

我试图弄清楚如果不在静态块中初始化它会有什么区别。我想知道这是否是一种做法。


8
它没有任何区别,但是其中之一涉及更多的键入和更多的代码行。
user253751'7

它们都将生成完全相同的字节码。您偏爱哪一个完全
取决于

您为什么不使用龙目岛?
恢复莫妮卡-M.Schröder'17

Answers:


48

除了涉及初始化程序序列的一些非常奇怪的极端情况之外,这两种选择将完全相同。

但是,在声明中初始化实例权限的过程更短,更熟悉,因此仅出于这个原因应该被首选。

静态初始化块是一种有点奇怪的构造,仅在它们实际提供附加值时才使用,例如当您需要处理异常时。


7
提到异常是使用静态块的一种罕见情况。
user949300

4
初始化HashMap是另一个很好的用例。
RubberDuck

3
@RubberDuck尽管Java 9的Map.of方法应对此有所帮助。
cbojar

1
@cbojar Map.of返回一个不变的映射,因此,如果您实际上需要一个映射,则HashMap仍然需要使用旧方法。或类似的东西new HashMap(Map.of(...))
kapex

1
@Kapep是的,如果需要可变映射而不是初始化程序块,我将使用它来传递给构造函数。
cbojar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.