[英]How to refactor inner class MouseAdapter?
假設我有一個像這樣的文件:
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
}
沒有更多細節,很難弄清楚這一點,但是基本上您的外部類正在響應消息,而鼠標偵聽器僅負責傳遞這些消息,而不負責響應這些消息。 在上面的示例中,這看起來比您已經擁有的代碼更多,但是我懷疑您會發現,以這種方式對其進行切片最終會導致更少的代碼-當然,這些代碼更易於測試和重用。
一種方法是將類bar
放在一個新文件中,然后將您需要的所有內容注入到構造函數中。 您需要將int
類的原始類型更改為Integer
類的對象。 然后,您可以創建一個Builder類來指導Foo
和Bar
的構造。 為了簡單起見,假設在所有Foo
和Bar
實例中都需要相同的Baz
實例:
class Builder {
// objects that both classes need are stored as member variables
// if you need multiple instances of baz you can also store a BazBuilder here
private Baz baz;
public Builder(Baz baz) {
this.baz=baz;
}
public Foo buildFoo() {
Foo foo = new Foo(baz);
return foo;
}
public Bar buildBar() {
Bar bar = new Bar(baz);
return bar;
}
}
這只是一個簡單的示例,但很容易擴展。 Builder#buildFoo()
可以接受Foo
的構造函數中所需的參數, Bar
也同樣可以。
編輯 BazBuilder
看起來像的小例子:
class BazBuilder {
Baz build(int value) {
return new Baz(value);
}
}
在Builder
您可以像這樣使用它:
class Builder {
private BazBuilder bazBuilder;
public Build(BazBuilder bazBuilder) {
this.bazBuilder = bazBuilder;
}
public Foo buildFoo() {
Baz baz = bazBuilder.build(5);
Bar bar = new Bar(baz);
Foo foo = new Foo(baz);
foo.add(bar);
return foo;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.