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?