我在接受采访时被问到这个问题。
我有一个方法说public int add(int i, int j)
,这个方法已被许多客户使用。
现在我必须对add方法进行更新(可能是一些增强),这会创建一个我必须抛出异常的场景。如何让现有客户端继续使用add()
方法而无需更改代码?
[访员提供了一个提示:客户可能会也可能不会使用我在添加方法中所做的任何新增强功能]
首先,我想过重载add,换行添加一个抛出异常的新add方法。
然后我想把Exception作为RuntimException
从添加...
但他们都没有接受正确的做法。
我缺少任何模式或设计方法?
答案 0 :(得分:1)
public class B {
public int add(int i, int j) {
return 0;
}
public int add(Integer i, Integer j) throws Exception {
return 0;
}
}
您可以利用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;
}
}
答案 1 :(得分:0)
如果客户端不老,您可以添加新的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();
}
...
}
新客户端可以使用新的add方法和额外的参数。