【问题标题】:AWT ActionListener as abstract classAWT ActionListener 作为抽象类
【发布时间】:2014-06-03 09:20:38
【问题描述】:

我有一个带有 AWT GUI 的 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) {
        (...)
    }
}

感谢您的帮助,对不起我的英语。 :-/

【问题讨论】:

  • final 有什么不好的地方?
  • mhh 目​​前很多属性都是最终的。我不知道这样好不好。而且我不知道如何从主类调用方法。
  • final 字段很好!编译器可以使用它们进行大量优化,包括有关内存可见性的内容。实际上,Eclipse 中甚至还有一个选项可以在保存时将所有非可变字段标记为最终字段。但是如果你坚持不让它们成为最终的,你可以创建一个私有类,然后将你的字段作为构造函数参数传递给它们。
  • 好的,谢谢! - 但是我怎样才能从主类中调用方法。我可以将这些设置为不是最终的吗?
  • 对不起,我不太明白你,你说的“从主类调用方法”是什么意思?

标签: java class awt abstract final


【解决方案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
            }
        });
    }
}

【讨论】:

  • 好的,谢谢! - 我可以将主类中的方法设置为 final 吗?
  • 如果它可以解决问题,那很好。如果它没有被继承,您可以创建整个类 final,而不是将每个方法设置为 final
  • 感谢您的示例。这似乎是一个很好的解决方案。但它是好的代码风格吗?
  • 不,最好创建多个final 字段而不是一个容器类,因为在这种情况下它是无用的。如果您确实需要隐藏大量 final 字段,这只是一个示例。
  • 好的,谢谢。以及如何在主类中调用方法? - 在问题中查看我编辑的代码。目前我必须将方法设置为静态,然后才能调用该方法。是好是坏,还是有更好的办法?
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2014-08-27
相关资源
最近更新 更多