-2

この単純な計算機を再構築する方法がわかりません。switchの代わりにinvokeメソッドを使用する必要があります。特定のオペレーターは、動的に適切なメソッドを実行する必要があります。ヒントはありますか?前もって感謝します!

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 );
         }
     });
 }
}
4

1 に答える 1

0

スイッチの使用が許可されていない場合、または使用できないその他の理由がある場合は、代わりにマップを使用できます。

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.
}

インターフェイスとその実装の 1 つが次の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;
    }
}

しかし、確かに、スイッチを使用した元のソリューションの方が簡単で読みやすいです。

于 2013-01-10T21:31:35.943 に答える