我有一些其他开发人员编写的课程:
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);
}
}
有人可以解释一下这段代码是否有效,在任何方法体外使用{}有什么好处?
答案 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编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。