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