У меня есть следующий код. Что является «правильным» и что я не понимаю:
private static void updateGUI(final int i, final JLabel label) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
label.setText("You have " + i + " seconds.");
}
}
);
}
Я создаю новый экземпляр класса Runnable, а затем в методе run
этого экземпляра использую переменные label
и i
. Это работает, но я не понимаю, почему это работает. Почему рассматриваемый объект видит значения этих переменных.
Насколько я понимаю, код должен выглядеть так (и это неправильно):
private static void updateGUI(final int i, final JLabel label) {
SwingUtilities.invokeLater(new Runnable(i,label) {
public Runnable(int i, JLabel label) {
this.i = i;
this.label = label;
}
public void run() {
label.setText("You have " + i + " seconds.");
}
});
}
Итак, я бы дал конструктору переменные i
и label
, чтобы объект мог получить к ним доступ ...
Кстати, в updateGUI
я использую final
перед i
и label
. Я думаю, что использовал final
, потому что компилятор хотел этого. Но я не понимаю, почему.