我的项目有一些喜欢静态初始化块的开发人员。什么是 替代 ?这个替代 的缺点是什么?
public class BlockTest {
String test = new String();
static{
test = "test string";
}
}
据我所知,静态初始化块用于设置静态字段的值,如果不能在一行中完成的话。但我不明白为什么我们需要一个特殊的块。这导致可读性降低和一些混乱。
答案 0 :(得分:3)
这个例子并不好。首先它不编译,你不能从静态init块分配实例变量。但即使它是正确的
public class BlockTest {
static String test = new String();
static{
test = "test string";
}
它没有任何意义,因为它等同于
public class BlockTest {
static String test = "test string";
但是这个静态init块没有其他选择
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
...
答案 1 :(得分:2)
它可以用于执行第一次引用类时需要完成的所有任务,甚至在创建类的实例之前。它可以调用不同的方法或只是初始化静态成员。静态阻止确保这些活动在课程的生命周期中仅执行一次,并且在关于班级的任何其他操作之前执行。
程序员可以依赖静态块,因为它确保块只执行一次,并且在执行与该类相关的任何其他活动之前。
此外,我认为它根本不会妨碍可读性。它可能因人而异。
答案 2 :(得分:1)
如果您的班级中有static
个成员需要更长时间的处理,那么您将无法绕过static
初始值设定项(构造函数)。毕竟这些必须在某处初始化。您可以在类的构造函数中执行此操作,但随后您将重新初始化这些值,每次创建新对象时。
如果您必须处理的不仅仅是简单的初始化,那么没有其他选择
请参阅this帖子和this。
答案 3 :(得分:0)
如果您有简单的作业,则可以直接在成员声明中进行作业。不需要单独的块来扩展复杂性和可读性。
另一种方法是使用延迟初始化。优点是它也可以是任意复杂的,但只在实际需要时执行。但是,当然只有你的班级有吸气剂才有效。如果您直接访问成员,那么这将是一个很大的变化。
答案 4 :(得分:0)
恕我直言,不需要静态阻止。
String test = "test string";
来自docs
可以在构造函数中初始化实例变量,可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java编程语言包括静态初始化块。
但是
注意:没有必要在类定义的开头声明字段,尽管这是最常见的做法。只有在使用它们之前才需要声明和初始化它们。