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的一部分。