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:?(参照字段创建自定义构造函数?)李>
# 1 楼答案
一般来说,这要看情况而定。如果您查看sun/oracle的java教程,您将看到它们也以不同的方式来实现这一点
甚至还有一个4。可能性:通过GUI类实现接口
从我个人的经验来看,我认为可读性胜过聪明。这意味着我会坚持一种方法,并在所有情况下使用一致的方法。只有有一个真正好的论点,我才会考虑改变风格。每个读者都对正在发生的事情有一个期望,期望得到了满足。如果他们不得不开始四处搜索或担心是否有其他事情发生(以及发生在哪里),这会使阅读和理解速度变慢
这通常会导致我的匿名内部类。它们总是在
addListeners()
方法中设置。我做了一些检查,如果必须做一些更严重的操作,我会从监听器内部调用其他(外部)类方法试试看。(是的,您甚至可以调用
foo = "bar";
)试试看(与匿名内部类的情况相同)
由于按值调用,这将不起作用。(MyButtonClickListener(字符串foo)。。foo=“bar”仅更改本地foo)。您可以传递对该对象的引用,并调用类似getter的setField
# 2 楼答案
A
Listener
与任何其他类一样;如果需要类的实例来操作另一个对象的字段,则将后者的引用作为构造函数的参数传递,并将其另存为对象字段之一。稍后,您将使用引用对象的公共接口来根据需要对其进行操作另一种方法(将
Listener
类进一步解耦)是将所有相关字段移动到Listener
类,这样它的实例就可以直接操作它们。每当您需要从实际使用Listener
(创建它并将它附加到某个组件的类)的类中访问这些字段时,您都可以使用实例的公共接口从实例中检索它们。当然,您需要保存实例的引用,而不仅仅是将其添加为侦听器(如案例1和案例2所示)