课堂上的大括号有什么作用?

时间:2013-06-17 12:53:54

标签: java

我有一些其他开发人员编写的课程:

public class ManifestFile implements Serializable {

private final static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
private final static XPathFactory xPathFactory = XPathFactory.newInstance();
private final static DateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd");
private final String uuid;
private final Set<File> attachments = new LinkedHashSet<File>();
private final transient ApplicationContext applicationContext = JavaService.INSTANCE.getApplicationContext();
private final transient File attachmentDirectory;
private final Date processAfter = new Date(System.currentTimeMillis() + 3 * 1000 * 60);

{
    try {
        documentBuilderFactory.setNamespaceAware(true);
        final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd")));
        documentBuilderFactory.setSchema(schema);
        documentBuilderFactory.setValidating(true);
    } catch (Throwable t) {
        throw new RuntimeException(t);
    }
}

我很惊讶这部分:

{
try {
    documentBuilderFactory.setNamespaceAware(true);
    final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd")));
    documentBuilderFactory.setSchema(schema);
    documentBuilderFactory.setValidating(true);
} catch (Throwable t) {
    throw new RuntimeException(t);
}
}

有人可以解释一下这段代码是否有效,在任何方法体外使用{}有什么好处?

5 个答案:

答案 0 :(得分:6)

这是实例初始值设定项块。它被称为类的实例初始化的一部分。

当初始化时,您还可以使用“static”为这样的块添加前一次调用它。这称为静态初始化程序。

来自Java Language Specification

  

8.6。实例初始化器

     

在创建类的实例时,将执行类中声明的实例初始化程序(第12.5节,第15.9节,第8.8.7.1节)。   ...

     
      
  • 如果实例初始值设定项无法正常完成,则为编译时错误(§14.21)。
  •   
  • 如果返回语句(第14.17节)出现在实例初始值设定项中的任何位置,则为编译时错误。
  •   
  • 允许实例初始值设定项通过关键字this(§15.8.3)引用当前对象,以使用关键字super(§15.11.2,§15.12),并在范围内使用任何类型变量。
  •   
  • 使用在使用后以声明方式显示声明的实例变量有时会受到限制,即使这些实例变量在范围内也是如此。有关控制实例变量的正向引用的精确规则,请参见§8.3.2.3。
  •   
     

实例初始化程序的异常检查在第11.2.3节中指定。

答案 1 :(得分:3)

这是实例初始值设定项。在创建对象时,在构造函数中的super()之后调用它。

请参阅以下示例:

public class Test {
    //instance initializer
{
    System.out.println("init block");
}

    public Test() {
        super();
        System.out.println("constructor");
    }

        //invoke to test
    public static void main (String ... args) {
        new Test();
    }
}

运行主打印这两行:

init block
constructor

这是因为构造函数实际上看起来像这样:

public Test() {
    super();
    {
        System.out.println("init block");
    }
    System.out.println("constructor");
}

答案 2 :(得分:2)

它是实例初始化块。实例初始化块代码在构造函数中调用super()之后运行,换句话说,在所有超级构造函数运行之后运行。初始化块在类中出现的顺序很重要。如果一个类有多个,它们都按照它们出现在类文件中的顺序运行。

Some rules to remember:
 1.Initialization blocks execute in the order they appear.
 2.Static Initialization blocks run once when the class is first loaded.
 3.Instance Initialization blocks run every time a class instance is created.
 4.Instance Initialization blocks run after the constructor’s call to super().

如需更多信息,请点击here

答案 3 :(得分:0)

括号表示实例初始值设定项。这是在任何构造函数运行之前直接运行的。

答案 4 :(得分:0)

这是实例初始化程序块。 Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。