匿名の内部クラスから外部クラスで宣言されている変数に値を取得するためのこのトリックに出くわしました。それは機能しますが、汚いハックのように感じます:
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];
}
(はい、この例を単純な に置き換えることができることは理解してJOptionPane
いますが、実際のダイアログはもっと複雑です。) 内部関数は、相互作用するすべての変数が であると主張していますが、内部関数が必要とするため、 を final としてfinal
宣言することはできません。myValue
値を割り当てます。これを 1 要素の配列として宣言すると、この問題は回避されますが、何らかの形で Bad Thing TMになる可能性があるようです。a.) これが一般的な慣行なのか、b.) これを行うことで深刻な問題が発生するのか、疑問に思っています。