Добавить новое исключение в существующий метод, не затрагивая устаревший код.

Мне задали этот вопрос в интервью.

У меня есть способ сказать public int add(int i, int j), и этот метод уже используется многими клиентами.

Теперь мне нужно сделать обновление (возможно, некоторое усовершенствование) методу добавления, который создает сценарий, в котором я должен выбросить исключение. Как я могу заставить существующих клиентов продолжать использовать метод add() без изменения кода с их конца? [Интервьюер дал подсказку: клиенты могут или не могут использовать любое новое усовершенствование, которое я сделал в методе добавления]

Сначала я подумал о перегрузке add, wrapping добавить новый метод add, который вызывает исключение. Затем я подумал о том, чтобы исключить Exception как RuntimException из...

Но ни один из них не принимался как правильный подход.

Любой подход к шаблону или дизайну отсутствует?

Ответ 1

Подход 1: Использование класса Wrapper Integer

public class B {
    public int add(int i, int j) {
        return 0;
    }

    public int add(Integer i, Integer j) throws Exception {
        return 0;
    }
}

Подход 2: Используйте Overriding

Вы можете воспользоваться overriding method can choose not to throw exception at all.

Что вы можете сделать, так это объявить класс Parent, который будет иметь метод с классом exception и child, который does not have the exception и переопределит метод из родителя. Теперь, когда вы хотите, чтобы клиенты использовали add с ссылкой об исключении исключений с типом A, в противном случае передайте ссылку с типом B:

class A { // <---New Class
    public int add(int i, int j) throws Exception { // <-- Method with Exception
        return 0;
    }
}

class B extends A { // <----Original Class
    @Override
    public int add(int i, int j) { // <--- Original Method
        return 0;
    }
}

Ответ 2

Вы можете добавить новый метод add (int i, int j, boolean isOldClient) и исключить исключение среды выполнения, если клиент не является старым. (Возможно, используйте более лучшее имя вместо isOldClient).

Затем сделайте что-то вроде этого

// legacy method
public int add(int i, int j) {
    return add(i, j, true);
}

// new add method
public int add(int i, int j, boolean isOldClient) {
    ...
    if (!oldClient) {
       ...                          // add code that throw exception
       throw new RuntimeException();
    }
    ...
}

Новые клиенты могут использовать новый метод добавления с дополнительным параметром.