如何在Java中从静态初始化块返回

9

我想从静态块中返回。

看起来return和break语句无效。有没有其他替代方案。

我知道一个不好的解决方法是创建一个标志(flag),并检查标志来确定是否继续执行。

我明白初始化块并不适合进行计算,只适合在类加载期间进行基本的初始设置。


3
请提供您的源代码。 - Dmitry Zagorulkin
我无法理解问题。请清晰地解释或提供您的代码以便易于理解。 - Kalai Selvan Ravi
2
@Kalai 我想他的意思是在初始化块中不能使用 return。JLS 14.17:“[...] 如果一个返回语句包含在实例初始化器或静态初始化器中,那么这是一个编译时错误 [...]”。 - user85421
5个回答

20

将代码委托给一个私有的静态方法:

static {
    initialize();
}

private static void initialize() {
    foo();
    if (someCondition) {
        return;
    }
    bar();
}

更简洁的初始化块写法。 - saurabh agrawal
2
无法以此方式分配“static final”字段。 - wilmol
@wilmol 当然可以 :) 你可以使用 private static final Singleton INSTANCE = initialize(); 或者 static { INSTANCE = initialize(); } - Gili

7

不要使用return,而是将条件代码包装在if中。


5

静态初始化程序没有必要变得复杂,所以即使您不同意单入口单出口原则,这也可能是个坏主意。

实现返回的最简单方法是使用带标签的break语句。

static {
    init: {
        ...
           break init;
    }
}

它们非常罕见,通常出现在嵌套的for循环中。这种新奇性可能会引起读者的警觉,认为一些可疑的事情正在发生。


0

你不能从静态初始化块中返回。没有任何可以返回的地方。但这并不是必要的。您应该能够重构您的代码,使其成为“单入口,单出口”。


我必须同意这个说法,它也会提供更干净(和更易读)的代码。 - Anders

0

你不能从静态块中返回,但最好使用其他函数来执行你的逻辑并返回到该块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接