使用反射代替开关



我不知道如何重建这个简单的计算器-我必须使用invoke方法而不是switch。具体操作人员有动态运行的合适方法。你有什么建议吗?提前感谢!

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class TokenTest extends JFrame
 {
 private JLabel prompt;
 private JTextField input;
 private JLabel result;
 public TokenTest()
     {
     super( "Testing Class StringTokenizer" );
     Container c = getContentPane();
     c.setLayout( new FlowLayout() );
     prompt = new JLabel( "Enter number1 operator number2 and press Enter" );
     c.add( prompt );
    input = new JTextField( 10 );
     input.addActionListener( new ActionListener()
                 {
         public void actionPerformed( ActionEvent e )
             {
             String stringToTokenize = e.getActionCommand();
             StringTokenizer tokens = new StringTokenizer( stringToTokenize );
             double res;
             double num1 = Integer.parseInt(tokens.nextToken());
             String sop = tokens.nextToken();
             double num2 = Integer.parseInt(tokens.nextToken());
             switch (sop.charAt(0)) {
             case '+' : res = num1 + num2; break;
             case '-' : res = num1 - num2; break;
             case '*' : res = num1 * num2; break;
             case '/' : res = num1 / num2; break;
             default  : throw new IllegalArgumentException();
           }         
             result.setText(String.valueOf(res));                
         }
     });
     c.add( input );
    result = new JLabel("");
    c.add(result);
     setSize( 375, 160 ); 
     show();
 }
    public static void main( String args[] )
     {
     TokenTest app = new TokenTest();
     app.addWindowListener( new WindowAdapter()
         {
         public void windowClosing( WindowEvent e )
             {
             System.exit( 0 );
         }
     });
 }
}

如果您不允许使用switch或有其他原因不允许使用它,您可以使用map代替。

Map<Character, Command> map = new HashMap<>();
map.put('+', sumCommand);
map.put('-', subCommand);
map.put('*', multCommand);
map.put('/', divCommand);

那么你可以简单地执行:

Command r = map.get(sop.charAt(0));
if (r != null) {
    r.execute(num1, num2);
} else {
    throw new IllegalArgumentException(); // I'd recommend using assertions here, like assert n != null.
}

Command接口和它的一个实现看起来是这样的。

public interface Command {
    double execute(double num1, double num2);
}
public class SumCommand implements Command {
    public double execute(double num1, double num2) {
        return num1 + num2;
    }
}

但是,可以肯定的是,使用switch的原始解决方案更容易且更具可读性。

相关内容

  • 没有找到相关文章

最新更新