1. Enum을 활용하고, 기본형 특화 인터페이스(IntBinaryOperator)를 활용하자.

private final Map<String, BinaryOperator<Integer>> functionByOperator = new HashMap<String, BinaryOperator<Integer>>() {{
		put("+", Integer::sum);
    put("-", (i, j) -> i - j);
    put("*", (i, j) -> i * j);
    put("/", (i, j) -> i / j);
}};

2. 접근제어자를 의미있게 사용

protected Integer calculate(String input) {...}

3. 메소드를 조금 더 분리하자

protected Integer calculate(String input) {
		isEmpty(input);
    String[] strings = input.split(DELIMETER);
		Integer total = 0;
    for (int i = 0; i < strings.length; i++) {
        String currentValue = strings[i];
        isValid(currentValue);
        if (isOperator(currentValue)) {
						total = functionByOperator.get(currentValue)
																			.apply(total, Integer.parseInt(strings[i + 1]));
            i++;
            continue;
        }
        total = Integer.parseInt(currentValue);
    }
    return total;
}

4. 상세한 주석은 권장되지 않는다.

: 메소드의 네이밍으로 의도를 나타내는것을 권장한다.

참고글

Clean Code - 주석(Comment)