1

我知道 Java 支持如下所示的对象初始化块。以下代码显示对象初始化块总是在创建 TestObjectInitialize 实例时调用。

public class TestObjectInitialize {

    public int abc;

    //object initialize block
    {
      abc= 5;
    }

    public TestObjectInitialize() {

    }


    public static void main(String... args) {
          TestObjectInitialize toi = new TestObjectInitialize();
          System.out.println(toi.abc);
    }

}
4

3 回答 3

4

我见过人们这样做:

Map<String, String> map = new HashMap<String, String>() {{
    put("key1", "value1");
    put("key2", "value2");
}};

当你有方法时它会很有用

class Init {
    static int initFoo(Map<String, String> map) {
        // ...
    }
}

你可以这样称呼它:

class FooBar {
    static int foo = Init.initFoo(new HashMap<String, String>() {{
                        put("key1", "value1");
                        put("key2", "value2");
                     }});
}
于 2013-01-31T10:08:32.673 回答
2

我已经多次使用static它的变体。例如,它可用于初始化类内的集合:

static List<String> words = new ArrayList<String>();
static {
    words.add("foo");
    words.add("bar");
}

这样做的主要好处是您将声明和初始化保持在同一个地方。非静态初始化程序仍然具有为所有构造函数运行的好处,而无需链接构造函数。

public class Foo {
    int value;
    {
        value = getDefaultValue();
    }

    public Foo() {
    }
    public Foo(String something) {
    }

}

value = getDefaultValue()无论使用什么 ctor 都会执行。

于 2013-01-31T10:16:05.983 回答
1

有人真的在 Java 中使用对象初始化块吗?

答案是肯定的。现在的问题是为什么?
如果您有可能需要编程逻辑来设置它们的最终变量。因为,最终变量必须在调用构造函数之前设置,唯一的方法是在声明期间将其设置为硬编码值,或者将其设置在初始化程序块内。虽然,也可以在构造函数中完成,但是如果在 clas 中定义了多个构造函数呢?然后,您必须在每个构造函数中初始化最终变量,这会导致代码冗余。欲了解更多信息,请观看此处此处

这在 Java 中的任何地方都使用过吗?

到目前为止,我还没有在 Java 的任何 API 中看到它。但我们大多数时候在代码中使用它,如下所示:

private final Set<String> VALID_CODES = new HashSet<String>() {{
    add("XZ13s");
    add("AB21/X");
    add("YYLEX");
    add("AR2D");
 }};
于 2013-01-31T11:50:14.107 回答