1

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

1.匿名型

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

2.类内部类型

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

3.外部类

所以上面相同,但在另一个类中。

问题

如果我在课堂上有一些使用按钮的字段并且我想用按钮做一些事情,这是最干净的方法?

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

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

2 回答 2

0

AListener与任何其他类别一样;如果您需要该类的实例来操作另一个对象的字段,则将后者的引用作为构造函数的参数传递并将其保存为对象字段之一。稍后,您可以使用被引用对象的公共接口来随意操作它。

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

于 2013-02-03T16:39:16.687 回答
0

如果我在课堂上有一些使用按钮的字段并且我想用按钮做一些事情,这是最干净的方法?

一般来说,这取决于。如果您查看 sun/oracle 的 java 教程,您也会看到它们以不同的方式执行此操作。
甚至还有一种可能:通过GUI类实现接口。

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

案例1(匿名内部类):我可以使用 MyClass.this.foo = "bar";

尝试一下。(是的,你甚至可以打电话foo = "bar";

案例2(内部类):相同

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

案例 3: ? (参照字段创建自定义构造函数?)

由于按值调用,这将不起作用。(MyButtonClickListener(String foo) .. foo = "bar" 仅更改本地 foo)。您可以传递对对象的引用并调用像 setField 这样的 getter。

于 2013-02-03T16:41:35.530 回答