11

我在一次采访中被问到这个问题。

我有一个方法说public int add(int i, int j),这种方法已经被许多客户使用。

现在我必须对 add 方法进行更新(可能是一些增强),这会创建一个我必须抛出异常的场景。我怎样才能让现有客户继续使用该add()方法而无需更改代码? [面试官提示:客户可能会或可能不会使用我在 add 方法中所做的任何新增强]

首先,我想到了重载 add,将 add 包装在一个抛出异常的新 add 方法中。然后我想到RuntimException从添加抛出异常......

但没有一个被认为是正确的方法。

我缺少任何模式或设计方法吗?

4

2 回答 2

1

方法一:利用 Wrapper Class 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 method can choose not to throw exception at all.

您可以做的是声明一个Parent类,该类将具有方法exceptionchild类,该类does not have the exception将覆盖父类的方法。现在,当您希望客户端使用add异常时,请使用 typeA传递引用,否则使用 type 传递引用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;
    }
}
于 2012-11-01T08:01:27.650 回答
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();
    }
    ...
}

新客户端可以使用带有额外参数的新添加方法。

于 2013-06-25T21:09:43.290 回答