在具有可接受/惯用的静态初始化程序的类中使用空静态方法吗?

Posted

技术标签:

【中文标题】在具有可接受/惯用的静态初始化程序的类中使用空静态方法吗?【英文标题】:Is using an empty static method in a class that has a static initializer acceptable/idiomatic? 【发布时间】:2015-05-09 21:01:47 【问题描述】:

我遇到了以下情况:

class Foo 

  static 
    // setup for logging and configuration
  

  public static void setup() 
    // do nothing
  


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

这是在测试套件中找到的。

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

【问题讨论】:

嗯,一方面,它可以防止Foo 的子类拥有自己的setup() 实现......有兴趣看看大师们怎么说。 @mazaneicha Bar extends Foo public static void setup()... 没有问题 @mazaneicha 不,它没有 我的意思是“防止子类覆盖setup()”。是的,隐藏它不是问题。 @mazaneicha 在 Java 中没有“覆盖静态方法”之类的东西。这适用于“真正的”方法,但静态方法不与类的实例相关联,因此该概念不适用于此处。而且你不能“隐藏它”(如果我没看错的话)。 【参考方案1】:

这是惯用的 Java 代码吗?

没有。

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

是的:这很令人困惑,这一问题的 cmets 证明了这一点。

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

我猜作者担心的是,如果不调用setup(),初始化可能不会发生。 setup() 方法保证静态初始化程序已执行其“记录和配置设置”。据推测,这种配置存在副作用,作者试图通过调用空方法来确保。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

您发布的代码是否与您遇到的完全相同?在 JUnit 中,通常的做法是使用带有 @BeforeClass 注释的静态方法来配置测试类,并使用带有 @Before 注释的实例方法来配置每个单元测试。

(以下是它们的使用示例:http://examples.javacodegeeks.com/core-java/junit/junit-before-and-beforeclass-example/)

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

【讨论】:

查看 OP 的 comment,表明 setup() 方法的目的不是 JUnit 的一部分。

以上是关于在具有可接受/惯用的静态初始化程序的类中使用空静态方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Static在类中的作用

静态常量整数数组

随笔25 java中的类加载顺序

C++ 静态 const 类成员初始化

@Autowired 在静态类中

OCUnit 测试在未测试的类中给出错误