Nested (Inner) Anonymous Classes in Java

Let’s see the Code

import java.util.Scanner;    public class Calculator {    	public static void main( String[] args ){  		Calculator c = new Calculator();  		c.calculate();  	}  	  	protected void calculate() {  		InputHelper helper = new InputHelper();  		String s1 = helper.getInput("Enter a number: ");  		String s2 = helper.getInput("Enter a number: ");  		String op = helper.getInput("Choose an operation (+ - * /): ");    		double result = 0;    		try {  			switch(op) {  				case "+":  					result = MathHelper.addValues(s1, s2);  					break;  				case "-":  					result = MathHelper.subtractValues(s1, s2);  					break;  				case "*":  					result = MathHelper.multiplyValues(s1, s2);  					break;  				case "/":  					result = MathHelper.divideValues(s1, s2);  					break;  				default:  					System.out.println("Invalid operation");  					return;  			}  			System.out.println("The result is: " +result);  		} catch( Exception e ) {  			System.out.println("Number formatting expression: " + e.getMessage());  		}  	}    	class InputHelper {  		private String getInput( String prompt ) {  			System.out.print(prompt);  			Scanner sc = new Scanner(System.in);  			return sc.nextLine();  		}  	}  }

 

public class MathHelper {  	public static double addValues(String s1, String s2) {  		double d1 = Double.parseDouble(s1);  		double d2 = Double.parseDouble(s2);  		return d1 + d2;  	}    	public static double subtractValues(String s1, String s2) {  		double d1 = Double.parseDouble(s1);  		double d2 = Double.parseDouble(s2);  		return d1 - d2;  	}  	public static double multiplyValues(String s1, String s2) {  		double d1 = Double.parseDouble(s1);  		double d2 = Double.parseDouble(s2);  		return d1 * d2;  	}  	public static double divideValues(String s1, String s2) {  		double d1 = Double.parseDouble(s1);  		double d2 = Double.parseDouble(s2);  		return d1 / d2;  	}    }

Notes:

  • MathHelper’s all methods are public.
  • Protected denotes the class which can be used by any other class within the same package.
  • Calculator c = new Calculator() -> creates an instance of the class
  • Above instantiation calls the Calculator() constructor which we haven’t defined. That’s okay since Java creates a no argument constructor automatically.
  • If we had protected static void calculate(), we could directly call the calculate() method.
  • class InputHelper is the nested class. Thus, getInput() is an instance method of InputHelper class.
  • For instance method, we need to created instance. Thus, InputHelper helper = new InputHelper();
  • Being a nested class, it is available to only Calculator class since that is where it is defined.
  • getInput() is marked private but it can be called because it is in the same code file as Calculator class.