为匿名内部类使用最终的1元素数组

Dar*_*man 6 java swing dialog final anonymous-function

我偶然发现了这个技巧,从匿名内部类中获取一个值,该变量在外部类中声明.它有效,但感觉就像一个肮脏的黑客:

private int showDialog()
{
    final int[] myValue = new int[1];

    JPanel panel = new JPanel();
    final JDialog dialog = new JDialog(mainWindow, "Hit the button", true);
    dialog.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );

    JButton button = new JButton("Hit me!");
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            myValue[0] = 42;
            dialog.setVisible(false);
        }
    });

    panel.add(button);
    dialog.add(panel);
    dialog.pack();
    dialog.setVisible(true);

    return myValue[0];
}
Run Code Online (Sandbox Code Playgroud)

(是的,我意识到这个例子可以用一个简单的替换JOptionPane,但我的实际对话框要复杂得多.)内部函数坚持认为它与之交互的所有变量都是final,但我不能将其声明myValue为final,因为内部函数需要为其分配一个值.将它声明为1元素阵列解决了这个问题,但似乎它可能是某种坏事TM.我想知道是否a.)这是常见做法或b.)这可能导致任何严重问题.

Jos*_*osh 0

这看起来确实很脏。我真的无法说出它有多“普遍”,而且我不知道你这样做会冒着世界毁灭的风险,但如果我需要这样的东西,我宁愿硬着头皮写一个成熟的内部类(而不是匿名类)来实现ActionListener. 这样,您就可以让它影响其封闭类的字段,并根据需要调用封闭类中的其他方法。根据您到底在做什么,甚至可能值得全力以赴并子类化Dialog来保存此逻辑。

作为一个额外的好处,非匿名内部类使调试变得不那么痛苦,因为您可以使用更多信息丰富的类标识符。