Добавить новое исключение в существующий метод, не затрагивая устаревший код.
Мне задали этот вопрос в интервью.
У меня есть способ сказать 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();
}
...
}
Новые клиенты могут использовать новый метод добавления с дополнительным параметром.