java中的双{{}}语法问题
可能重复:
Java“双Brace初始化”的效率?
新类的意义(...){{...}}初始化习语
假设我通过以下方式创建了一个JMenu栏:
JMenuItem saveMenuItem = new JMenuItem("Save")
{{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
String location = GUI.Custom.QuickDialogs.selectFile(false);
try
{
PrintWriter pw = new PrintWriter(new File(location));
String text = textArea.getText();
pw.println(text);
pw.flush();
pw.close();
}
catch(Exception ex)
{
textArea.append("Could not save this debug output");
}
}
});
}};
JMenu optionsMenu = new JMenu("Options")
{{
add(saveMenuItem);
setVisible(true);
}};
private JMenuBar menuBar = new JMenuBar()
{{
add(optionsMenu);
setVisible(true);
}};
这是一种糟糕的设计模式,用这种方式创建对象,而不是仅仅声明变量,然后在构造函数或其他东西中创建对象?
你所做的称为:“初始化块”。
从doc:
Java编译器将初始化程序块复制到每个构造函数中。 因此,这种方法可以用来在多个构造函数之间共享一段代码
例:
class A {
private String field1;
{
field1 = "example field";
field2 = getstaticResult();
}
}
但在我看来,我们不应该经常使用它,特别是在你的情况下,使用它是非常不寻常的。
Double Brace Initialization没有任何问题; 我经常用它来制作地图和列表。
这可能取决于你的观众是谁 - 你的团队中的其他人员是否明白你在这里做什么? 请记住,有一天,有人将不得不阅读此代码。
你似乎在这里问(至少)两件不同的事情。 双括号成语是已知的,通常用作创建匿名内部类的简写,用初始化块代替显式构造函数。 通常这会使代码更具可读性,所以我会说这没问题。
OTOH由于(非静态)初始化块是语言的一个相对新近的补充,所以一些开发者可能不熟悉它们,这可能会造成混淆。 当然,就像几乎所有的技术一样,当过度使用时,它可能会产生比解决问题更多的问题。
链接地址: http://www.djcxy.com/p/82387.html上一篇: Double {{ }} syntax question in java
下一篇: XX:MaxPermSize do?