Java 我们为什么需要初始化块的示例
我正在讨论以下主题: 我不明白我们是否有一个构造函数,在这里我们可以放置一些逻辑,比如处理异常情况,为什么我们需要初始化块,哪些代码我们也可以移动到构造函数Java 我们为什么需要初始化块的示例,java,initialization,block,Java,Initialization,Block,我正在讨论以下主题: 我不明白我们是否有一个构造函数,在这里我们可以放置一些逻辑,比如处理异常情况,为什么我们需要初始化块,哪些代码我们也可以移动到构造函数 如果答案是在某些情况下,我们需要在构造函数运行之前初始化一些资源,那么您能帮我举一些例子吗,这样我就可以完全看到这幅图。您使用(我也使用过)静态初始化块的一个例子是初始化元素集合。例如,如果我有一组存储在静态映射中的解析器: private static Map<String, Parser> parsers = new
如果答案是在某些情况下,我们需要在构造函数运行之前初始化一些资源,那么您能帮我举一些例子吗,这样我就可以完全看到这幅图。您使用(我也使用过)静态初始化块的一个例子是初始化元素集合。例如,如果我有一组存储在静态映射中的解析器:
private static Map<String, Parser> parsers = new HashMap<String, Parser>();
我之所以这样做,是因为我希望贴图是静态的,而不是特定对象的一部分,或者如果我只希望有一个贴图(也许我只需要一个)
这与构造函数的区别在于,构造函数在对象实例化时调用,而静态初始化块在类加载时调用
也就是说,如果你打电话
MyClass.parsers.get("node");
MyClass
构造函数永远不会被调用,因此如果在构造函数出现之前等待初始化解析器
映射,上述调用将返回null。使用静态初始化块的一个例子是初始化元素集合。例如,如果我有一组存储在静态映射中的解析器:
private static Map<String, Parser> parsers = new HashMap<String, Parser>();
我之所以这样做,是因为我希望贴图是静态的,而不是特定对象的一部分,或者如果我只希望有一个贴图(也许我只需要一个)
这与构造函数的区别在于,构造函数在对象实例化时调用,而静态初始化块在类加载时调用
也就是说,如果你打电话
MyClass.parsers.get("node");
从不调用MyClass
构造函数,因此,如果在构造函数出现之前等待初始化解析器
映射,上述调用将返回null
为什么我们需要初始化块
例如初始化块,我只能考虑两种情况:
Runnable runnable = new Runnable() {
int x;
//initialization block here
{
//IMO this is such odd design, it would be better to not
//create this as an anonymous class
x = outerClassInstance.someMethod();
}
@Override
public void run() {
//write the logic here...
}
};
final
):
Runnable runnable = new Runnable() {
int x;
//initialization block here
{
//IMO this is such odd design, it would be better to not
//create this as an anonymous class
x = outerClassInstance.someMethod();
}
@Override
public void run() {
//write the logic here...
}
};
final
):
我脑子里没有现成的例子,所以这是一个评论。如果您不想在构造函数之间重复工作,那么初始化块很好。如果您想在初始化静态变量时做更复杂的工作,静态初始化块很好。@user3580294您可以调用另一个构造函数以避免在初始化块中放入逻辑。@LuiggiMendoza但可能存在这样的情况:我们有
构造函数(字符串)
构造函数(int)
这个构造函数可以用不同的方式设置实例,所以它们不应该混合使用。@Pshemo在这种情况下使用生成器模式。@luigimendoza我开始想为什么我们实际上需要初始化块(不是静态块,例如在中它们可能很有用)我没有现成的例子,这是一个评论。如果您不想在构造函数之间重复工作,那么初始化块很好。如果您想在初始化静态变量时做更复杂的工作,静态初始化块很好。@user3580294您可以调用另一个构造函数以避免在初始化块中放入逻辑。@LuiggiMendoza但可能存在这样的情况:我们有构造函数(字符串)
构造函数(int)
这个构造函数可以用不同的方式设置实例,所以它们不应该混合使用。@Pshemo在这种情况下使用生成器模式。@luigimendoza我开始想为什么我们实际上需要初始化块(不是静态块,它们在实例中可能很有用)对于静态
初始值设定项,我能找到的最好的例子是,必须从配置文件中检索常量变量,并且必须保持常量。@LuiggiMendoza Yeah,这是静态初始值设定项的一个很好的用法。静态
初始值设定项的最佳示例是,必须从配置文件中检索常量变量,并且必须保持常量。@luigimendoza是的,这是静态初始值设定项的一个很好的用法