Java 在具有静态初始值设定项的类中使用空静态方法是否可以接受/惯用?

Java 在具有静态初始值设定项的类中使用空静态方法是否可以接受/惯用?,java,static,initialization,idioms,Java,Static,Initialization,Idioms,我遇到了以下情况: class Foo { static { // setup for logging and configuration } public static void setup() { // do nothing } } 这是惯用的Java代码吗?是否有具体的原因应该避免这种情况 这是在一个测试套件中发现的 我最初担心的是,从理论上讲,初始化可以在不调用#setup()的情况下进行 这是惯用的Java代码吗 没有 是否有具体的原因应该避免这

我遇到了以下情况:

class Foo {

  static {
    // setup for logging and configuration
  }

  public static void setup() {
    // do nothing
  }

}
这是惯用的Java代码吗?是否有具体的原因应该避免这种情况

这是在一个测试套件中发现的

我最初担心的是,从理论上讲,初始化可以在不调用#setup()的情况下进行

这是惯用的Java代码吗

没有

是否有具体的原因应该避免这种情况

是的:从对这个问题的评论可以看出,这很令人困惑

我最初担心的是,理论上可能会发生初始化 不调用#setup()


我猜作者担心的是,如果不调用
setup()
,初始化可能无法进行。
setup()
方法保证静态初始值设定项已执行其“日志和配置设置”。想必,作者试图通过调用empty方法来确保这种配置存在副作用。

您发布的代码是否正是您遇到的?在JUnit中,通常使用带注释的静态方法来配置测试类,使用带注释的实例方法来配置每个单元测试

(以下是它们的使用示例:)


否则,它看起来确实很奇怪…

它肯定不是惯用的,因为您限制了那些静态方法和块继承到子类。是的,出于初始化目的,静态方法不需要被调用,因为它们是在类加载到JVM时初始化的。执行时,静态块首先从上到下执行。

首先,它阻止
Foo
的子类拥有自己的
setup()
实现。。。我很想看看大师们是怎么说的。@mazaneicha
条扩展Foo{public static void setup(){…}}
@mazaneicha不,它的意思是“防止子类重写
setup()
”。是的,隐藏它不会有问题。@mazaneicha在Java中没有“重写静态方法”这样的事情。这适用于“true”方法,但静态方法与类的实例不关联,因此该概念在这里不适用。你不能“隐藏它”(如果我没看错的话)。请看操作说明
setup()
方法不是JUnit的一部分。