有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在不同类中实现ButtonListener的最佳方法是什么?

我知道3种创建侦听器的方法:

一,。匿名类型

 btn.addClickListener(new ButtonClickListener(){
   doSomething();
 })

二,。类内部类型

btn.addClickListener(new MyButtonClickListener());
public MyButtonClickListener implements ButtonClickListener{}

三,。外部类

同样的,但在另一个类中

问题

如果我在类中有一些字段使用按钮,并且我想用按钮做一些事情,那么哪种方法最干净

例如,我将String a = "foo"作为一个字段,当我单击按钮时,我想更改此字段

  • 案例1:我可以使用MyClass.this.foo = "bar";
  • 案例2:相同
  • 案例3:?(参照字段创建自定义构造函数?)

共 (2) 个答案

  1. # 1 楼答案

    If I have some fields in the class who use the button and I want to do something with buttons, which is the cleanest way?

    一般来说,这要看情况而定。如果您查看sun/oracle的java教程,您将看到它们也以不同的方式来实现这一点
    甚至还有一个4。可能性:通过GUI类实现接口

    从我个人的经验来看,我认为可读性胜过聪明。这意味着我会坚持一种方法,并在所有情况下使用一致的方法。只有有一个真正好的论点,我才会考虑改变风格。每个读者都对正在发生的事情有一个期望,期望得到了满足。如果他们不得不开始四处搜索或担心是否有其他事情发生(以及发生在哪里),这会使阅读和理解速度变慢
    这通常会导致我的匿名内部类。它们总是在addListeners()方法中设置。我做了一些检查,如果必须做一些更严重的操作,我会从监听器内部调用其他(外部)类方法

    Case 1 (anonymous inner class): I can use MyClass.this.foo = "bar";

    试试看。(是的,您甚至可以调用foo = "bar";

    Case 2 (inner class): the same

    试试看(与匿名内部类的情况相同)

    Case 3: ? (Create a custom constructor with reference to the field?)

    由于按值调用,这将不起作用。(MyButtonClickListener(字符串foo)。。foo=“bar”仅更改本地foo)。您可以传递对该对象的引用,并调用类似getter的setField

  2. # 2 楼答案

    A Listener与任何其他类一样;如果需要类的实例来操作另一个对象的字段,则将后者的引用作为构造函数的参数传递,并将其另存为对象字段之一。稍后,您将使用引用对象的公共接口来根据需要对其进行操作

    另一种方法(将Listener类进一步解耦)是将所有相关字段移动到Listener类,这样它的实例就可以直接操作它们。每当您需要从实际使用Listener(创建它并将它附加到某个组件的类)的类中访问这些字段时,您都可以使用实例的公共接口从实例中检索它们。当然,您需要保存实例的引用,而不仅仅是将其添加为侦听器(如案例1和案例2所示)