Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在现有方法中添加新异常,而不影响旧代码_Java_Exception - Fatal编程技术网

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();
    }
    ...
}