Вы просто получаете доступ к text1. Его не нужно оборачивать и он не должен быть окончательным.
Есть два основных места для размещения ваших переменных: на уровне класса (здесь они не могут быть финальными, потому что они не в конструкторе), или внутри метода, где они могут быть объявлены как финальные, независимо от того, какой метод называется. Вот пример обоих способов использования переменных:
public class MyView extends ViewPart {
private Text text1;
public void createPartControl(Composite parent) {
text1 = new Text(parent, SWT.None);
final Text text2 = new Text(parent, SWT.None);
parent.getDisplay().asyncExec(new Runnable() {
public void run() {
text1.setText("Hello");
text2.setText("World");
}
});
}
public void setFocus() {
text1.forceFocus();
}
public void someNetworkMessageReceived(MyMessage message) {
getSite().getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
text1.setText(message.toString());
}
});
}
}
Анонимные внутренние классы ведут себя так же, как и все другие внутренние классы. Когда вы создаете экземпляр внутреннего класса, java прозрачно передает ссылку на внешний класс (ы) во внутренний класс. Это позволяет вам получить доступ к любому из полей во внешнем классе изнутри внутреннего класса. Поскольку внутренний класс содержит ссылку на внешний класс, внешний класс не сможет собрать мусор или выйти из области видимости раньше, чем внутренний класс. Вот почему вам не нужно делать текст1 окончательным. Он всегда будет доступен для использования внутренними классами.
Когда вы объявляете переменную внутри метода, это другая история. Анонимный внутренний класс, объявленный в createPartControl (), вероятно, превзойдет область действия метода. Возможно, нет, но Java не рискует. Когда метод выходит из области видимости, ссылка на text2 будет потеряна, и внутреннему классу не повезет. Чтобы исправить эту Java, необходимо использовать модификатор final в text2. Что в итоге делает то, что гарантирует, что переменная всегда будет указывать на один и тот же объект в памяти. Поскольку в Java теперь есть гарантия того, что этот объект будет в памяти, он может перейти в это место во внутренний класс. Для практических целей создается впечатление, что создается внутренняя класс новой переменной с именем text1 типа Text, что позволяет вам обращаться к ней еще долго после того, как метод выходит из области видимости.
В вашем случае вы бы просто сделали все компоненты пользовательского интерфейса, к которым необходимо получить доступ изнутри
Переменные экземпляра someNetworkMessageReceived () так же, как text1.
Надеюсь, это прояснит вашу путаницу с последним модификатором.