簡體   English   中英

實施actionPerformed的最佳方式?

[英]Best way to implement actionPerformed?

在Java中,我們有兩種方式來實現actionPerformed:

  1. 每個 class 的一種 actionPerformed 方法:使用 if-else 檢查事件源;
  2. 使用匿名內部類並在創建 object 的地方實現 actionPerformed 方法;

對於選項 1,很容易跟蹤 actionPerformed 代碼的位置,因為每個 class 只有一個方法。 我們可以輕松找到該方法,然后查看內部以找到我們正在尋找的代碼。 但是,如果我們有很多動作監聽器,可能會有太多的 if-else 子句。

對於選項 2,不容易找到 actionPerformed 代碼的位置,因為它分散在 class 各處。 如果您有許多動作偵聽器,則跟蹤 actionPerformed 實例將更加困難。

我個人更喜歡選項 1,因為它更容易維護代碼,甚至性能可能不如選項 2。

每種方法的優缺點是什么? 在選擇如何實現 actionPerformed 時還應該考慮什么? 你更喜歡哪種方式?

編輯:

因此,根據下面 A. Lee 的建議,有第三個選項。 它是選項 1 和選項 2 的組合:使用匿名內部類,但將它們完全放在 class 中的一個位置。 我認為這是個好主意。

我認為 actionPerformed 方法中長長的 if-else 鏈很難看,原因有幾個 - 您每次都進行不必要的檢查以確定哪個是ActionEvent的合適接收器代碼,並且隨着代碼的增長,它變得越來越難以維護。

如果您希望將所有操作處理程序放在一個位置,請使用一個將您的 ActionListeners 綁定到控件的initializeActionListeners方法。 或者將它們綁定在您初始化它們的位置,以便事件處理程序更接近您的小部件/控件本身,例如,

// not thread-safe
private JLabel getSomeLabel() {
    if (someLabel == null) {
        someLabel = new JLabel("Some label, huh");
        someLabel.addActionListener(...)
    }
    return someLabel;
}

錯誤的選擇:問題不是匿名類與一個長的大 if-else 構造(你可以很容易地在前者中使用后者)。 問題是是否有一個語義強大的 class (匿名與否),它只完成一項工作,是唯一一個完成它並且完全完成它的工作。 畢竟,我們在 OO 領域;-)

所以:嚴格禁止任何 if-then-else 結構。

我使用第三個選項,我編寫了自己的 Manager,它通過注釋直接將方法綁定到 JButtons。

我將它作為一個開源項目提供,您可以在https://github.com/MarkyVasconcelos/Towel/wiki/ActionManager上查看它

優點是您不需要實現任何 ActionListener,也不需要匿名內部類。

所有操作都在您的 class 的方法中。

在大多數情況下,沒有太大區別,建議一個優於另一個。

我會說:如果情況相似,請將它們放在一起,但只是從那里調用適當的方法:

    public void actionPerformed (ActionEvent e)
    {
            String cmd = e.getActionCommand ();
            if (cmd.equals (cmdNextPage))        nextPage ();
            else if (cmd.equals (cmdLastPage))   lastPage ();
            else if (cmd.equals (cmdOk))         ok ();
            // ... and so on

這樣,您可以輕松地調用方法,獨立於事件,可能來自測試框架,或者用於某些撤消/重放。 共同的模式是顯而易見的。

在極少數情況下,您可能對注銷單個事件和獨立來源感興趣。 然后,每個 ActionEvent 的單個偵聽器似乎更適合。

從純粹的 OOP 的角度來看,我認為每個按鈕(例如)單個偵聽器更直接,並且從不成熟的優化願望來看,我對 20 或 40 個 ActionListener 感到不舒服,但在我理性的時候,我不相信 40 個 ActionListener 會產生可衡量的影響。 但是它們會弄亂你的文件系統,你的 IDE 瀏覽器,所以我想最終有一個合理的理由,將監聽器的數量保持在低水平。

一個普通的監聽器在按鈕工廠中很容易使用:

    private void addButton (JPanel jp, String cmd, String ttt)
    {
            JButton jb = new JButton (cmd);
            jb.setToolTipText (ttt);
            jp.add (jb);
            jb.addActionListener (this);
            buttonlist.add (jb);
    }

    /**   @return a Panel with Action-Buttons.     */
    private JPanel createControlPanel ()
    {
            JPanel m = new JPanel ();
            m.setLayout (new BoxLayout (m, BoxLayout.Y_AXIS));

            JPanel jpc = new JPanel ();
            jpc.setLayout (new FlowLayout ());
            buttonlist = new ArrayList <JButton> ();

            addButton (jpc, cmdLastPage, "last page");
            addButton (jpc, cmdNextPage, "next page");
            addButton (jpc, cmdOk, "save");
            addButton (jpc, cmdEsc, "exit");

在哪里添加新按鈕以及如何添加非常簡單明了。 我覺得它非常易於維護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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