2014-04-26 42 views
1

所以我正在製作一個自定義菜單,這是處理調用正確方法的子菜單項類。目前,我正在爲方法名稱使用switch語句,但它是實現它的最佳方式嗎?Java使用給定字符串調用方法的最佳方法

我會喜歡一套新的眼睛,我一直在這樣看待這個漫長的。謝謝!

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JLabel; 

import com.as.devcenter.Util; 

public class MenuSubItem extends JLabel implements MouseListener { 

    private static final long serialVersionUID = 1L; 

    private String action = ""; 

    public MenuSubItem(String label, String action, Class<?> className) { 
    addMouseListener(this); 

    this.action = action; 

    setText(label); 
    setName(action); 
    setSize(Util.widthOfText(getText(), Util.getDefaultFont()) + 4, 22); 
    } 

    /* 
    * Start Mouse Events 
    */ 

    @Override 
    public void mouseClicked(MouseEvent e) { 
    Util.log("MenuSubItem clicked"); 
    if (action.equalsIgnoreCase("")) { 
     Util.log("No action was provided for MenuSubItem: " + getText()); 
    } else { 
     try { 
     Method method = Actions.class.getDeclaredMethod(action, className); 

     switch (method.getName()) { 
     case "newProject": 
      NewProjectFrame npf = new NewProjectFrame(); 
      method.invoke(npf, npf); 
      break; 
     case "openConsole": 
      Console console = new Console(); 
      method.invoke(console, console); 
      break; 
     } 
     } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) { 
     if (e1 instanceof NoSuchMethodException) { 
      Util.log("Could not identify action: " + action); 
     } else { 
      e1.printStackTrace(); 
     } 
     } 

    } 
    } 

    public void mousePressed(MouseEvent e) { 
    } 

    public void mouseReleased(MouseEvent e) { 
    } 

    public void mouseEntered(MouseEvent e) { 
    } 

    public void mouseExited(MouseEvent e) { 
    } 
} 

Actions類(只是有2種方法大氣壓,但將有更多)

public class Actions { 

    public static void newProject(NewProjectFrame npf){ 
     npf.setup(); 
     Util.getProgram().items[0].clear(); 
    } 

    public static void openConsole(Console console){ 
    console.setup(); 
    Util.getProgram().items[0].clear(); 
    } 
} 

回答

1

使用命令模式:

在面向對象的編程中,該命令模式是一種行爲 設計模式,其中對象用於表示和封裝以後調用方法所需的所有信息。此信息包括方法名稱,擁有方法 的對象以及方法參數的值。

http://en.wikipedia.org/wiki/Command_pattern

這個例子很相似,你的問題:

http://alvinalexander.com/java/java-command-design-pattern-in-java-examples

+0

好吧,我給這個試試吧!謝謝=) – user1767369