AWT ActionListener как абстрактный класс

У меня есть программа с графическим интерфейсом AWT на Java. Моя проблема в том, что у меня есть много абстрактных классов (ActionListener) в этой программе. В рамках этих абстрактных классов мне нужно вызывать атрибуты из основного класса. Итак, на данный момент я должен установить все необходимые атрибуты как окончательные. Это не приятно. Мой вопрос заключается в том, как я могу вызвать атрибуты из основного класса (не устанавливая это в качестве окончательного). Какой стиль кода лучше?

Например:

public class mainClass {
    TextField field1 = new TextField(10);
    (...)
    Button connect = new Button("Connecting...");
    (...)
    connect.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent ex) {
            methodFromTheMainClass(field1.getText());
            // How can I call the method methodFromTheMainClass?
         }
    });

    private void methodFromTheMainClass(String fieldContent) {
        (...)
    }
}

Спасибо за помощь, и извините за мой английский.:-/

1 ответ

Решение

final Ключевое слово является довольно хорошим решением почти везде, где его можно использовать. В вашем случае вполне нормально использовать final ключевое слово.

Но если вы сильно хотите, чтобы поля не final(или из-за ваших потребностей в бизнес-логике) просто создайте внутренний (нестатический) класс, который содержит все ваши поля, доступ к которым осуществляется из локальных абстрактных классов.

Вот пример:

public class YourClass { 

    private class Container {
        private TextField field = new TextField();
        private Button connectButton = new Button("Connecting...");
    }

    private final Container container = new Container();

    private void establishConnection() {
        container.connectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // connection code here

                container.field.setText("Connection established"); // access to an inner class
            }
        });
    }
}
Другие вопросы по тегам