Java 在现有方法中添加新异常,而不影响旧代码
我在一次采访中被问到这个问题 我有一个方法,叫做Java 在现有方法中添加新异常,而不影响旧代码,java,exception,Java,Exception,我在一次采访中被问到这个问题 我有一个方法,叫做publicintadd(inti,intj),这个方法已经被许多客户机使用 现在,我必须对add方法进行更新(可能是一些增强),这将创建一个必须抛出异常的场景。如何使现有客户端继续使用add()方法,而不改变其端部的代码? [采访者给出了一个提示:客户可能会也可能不会使用我在add方法中所做的任何新增强] 首先,我想到重载add,将add包装到一个新的add方法中,该方法会引发异常。 然后我想到从add中抛出异常 但没有一个被认为是正确的方法 我
publicintadd(inti,intj)
,这个方法已经被许多客户机使用
现在,我必须对add方法进行更新(可能是一些增强),这将创建一个必须抛出异常的场景。如何使现有客户端继续使用add()
方法,而不改变其端部的代码?
[采访者给出了一个提示:客户可能会也可能不会使用我在add方法中所做的任何新增强]
首先,我想到重载add,将add包装到一个新的add方法中,该方法会引发异常。
然后我想到从add中抛出异常
但没有一个被认为是正确的方法
我缺少的任何模式或设计方法?方法1:使用包装器类Integer
方法2:利用覆盖
您可以利用重写方法的优势,可以选择根本不引发异常
您可以做的是声明一个父类
类,该类将具有带有异常的方法
和子类
类,该类没有异常
,并将重写父类的方法。现在,当您希望客户端使用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;
}
}
class A{//您可以添加新的add(inti,intj,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方法。因此,您建议B
是原始类,应该修改它以具有新的父类a
,该父类显示新行为并引发异常?如果客户端已经在使用B
的实例,这怎么可能?@DuncanJones客户端可能会也可能不会使用我在add method中所做的任何新增强,这是问题中的提示。这意味着B
可以保持原样。B中除了A的扩展之外没有任何更改,所以如果库以“是”的形式发布,代码将按原样编译,该提示会令人困惑。您可以使用该提示来证明几乎是正确的在你的例子中(顺便说一句,这很有帮助!)如果客户想要新功能,他们需要调整他们的代码以使用A
。他们也可以轻松地调整他们的代码以调用addX
,而不是add
,其中addX
是新功能。但是,我怀疑你的答案可能是他们想要的。-1:这个答案不是问题因为OP说add()抛出一个异常。客户端操作B的一个实例。他们对A一无所知。如果B.add()调用super.add(),代码就永远不会编译。@Aubin这只是一个例子,如果你有工厂,客户端就无法知道使用的是哪个实例。指定同一个OP已经知道的答案有什么意义
// 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();
}
...
}