簡體   English   中英

如何重構內部類MouseAdapter?

[英]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類來指導FooBar的構造。 為了簡單起見,假設在所有FooBar實例中都需要相同的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM