假设我有一个像这样的文件:
import javax.swing.JPanel;
import java.awt.event.MouseAdapter;
public class Foo extends JPanel
{
private int m;
private int n;
private int o;
public Foo()
{
this.addMouseListener(new Bar());
}
class Bar extends MouseAdapter
{
// ...
// methods here access and modify values of the private
// instance variables.
// ...
}
}
显然,我可以在
Foo
中添加简单的访问器和mutator,但这很快就会变得乏味并且完全破坏了封装。我如何重构此内部类,同时将对封装的损害降到最低? 最佳答案
如果这些类看起来太大,则应拆分它们。拆分它们的第一步是停止依赖外部类的私有实例变量。如您所说,您可以添加公共获取器和设置器,但更好的方法是让Foo实现Bar的公共接口,并让Bar仅仅与该接口对话。并用self初始化每个Bar。
public class Bar extends MouseAdapter {
public interface Caller {
void thingClicked();
...
}
}
public class Foo extends JPanel implements Bar.Caller {
...
}
因此,现在在Bar中,您会遇到类似以下情况:
public void mouseUp() {
m = m + 1;
n = 0
}
你现在有
public void mouseUp() {
caller.thingClicked();
}
并且,在Foo中:
public void thingClicked() {
m = m + 1;
n = 0
}
没有更多细节,很难弄清楚这一点,但是基本上您的外部类正在响应消息,而鼠标侦听器仅负责传递这些消息,而不负责响应这些消息。在上面的示例中,这看起来比您已经拥有的代码更多,但是我怀疑您会发现,以这种方式对其进行切片最终会导致更少的代码-当然,这些代码更易于测试和重用。
关于java - 如何重构内部类MouseAdapter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29547615/