You can write the AbstractCalculationOperation class using the execute method, with Add , Subtract , etc., extending it.
Then just leftHand , rightHand and calculationOperation and run calculationOperation.execute( rightHand, leftHand ) .
public interface CalculationOperation { double calculate ( double lh, double rh ); long calculate ( long lh, long rh ); } public class Add implements CalculationOperation { public static final CalculationOperation INSTANCE = new Add(); public double calculate ( double rh, double lh ) { return lh + rh; } public long calculate ( long rh, long lh ) { return lh + rh; } }
And then:
int lh = exp.substring(0, i); int rh = exp.substring(i+1); CalculationOperation op; switch( exp.charAt(i) ) { case '*': op = Multiply.INSTANCE; break; case '/': op = Divide.INSTANCE; break; case '+': op = Add.INSTANCE; break; case '-': op = Subtract.INSTANCE; break; } newResult = op.calculate( rh, lh ); primeResult = newResult; System.out.println(primeResult);
Alternative listing option:
public enum Calculation { ADD('+') { public int calculate( int lhs, int rhs ) { return lhs + rhs; } public long calculate( long lhs, long rhs ) { return lhs + rhs; } public float calculate( float lhs, float rhs ) { return lhs + rhs; } public double calculate( double lhs, double rhs ) { return lhs + rhs; } }, SUBTRACT('-') { public int calculate( int lhs, int rhs ) { return lhs - rhs; } public long calculate( long lhs, long rhs ) { return lhs - rhs; } public float calculate( float lhs, float rhs ) { return lhs - rhs; } public double calculate( double lhs, double rhs ) { return lhs - rhs; } }, MULTIPLY('*') { public int calculate( int lhs, int rhs ) { return lhs * rhs; } public long calculate( long lhs, long rhs ) { return lhs * rhs; } public float calculate( float lhs, float rhs ) { return lhs * rhs; } public double calculate( double lhs, double rhs ) { return lhs * rhs; } }, DIVIDE('/') { public int calculate( int lhs, int rhs ) { return lhs / rhs; } public long calculate( long lhs, long rhs ) { return lhs / rhs; } public float calculate( float lhs, float rhs ) { return lhs / rhs; } public double calculate( double lhs, double rhs ) { return lhs / rhs; } }; private final char textValue; Calculation ( char textValue ) { this.textValue = textValue; } public abstract int calculate ( int lht, int rhs ); public abstract long calculate ( long lht, long rhs ); public abstract float calculate ( float lht, float rhs ); public abstract double calculate ( double lht, double rhs ); public static Calculation fromTextValue( char textValue ) { for( Calculation op : values() ) if( op.textValue == textValue ) return op; throw new IllegalArgumentException( "Unknown operation: " + textValue ); } }
and then:
int lh = exp.substring(0, i); int rh = exp.substring(i+1); Calculation op = Calculation.fromTextValue( exp.substring(i,1) ); newResult = op.calculate( lh, rh ); primeResult = newResult; System.out.println(primeResult);