在现有方法中添加新异常,而不会影响遗留代码

时间:2012-11-01 07:47:54

标签: java exception

我在接受采访时被问到这个问题。

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

现在我必须对add方法进行更新(可能是一些增强),这会创建一个我必须抛出异常的场景。如何让现有客户端继续使用add()方法而无需更改代码? [访员提供了一个提示:客户可能会也可能不会使用我在添加方法中所做的任何新增强功能]

首先,我想过重载add,换行添加一个抛出异常的新add方法。 然后我想把Exception作为RuntimException从添加...

但他们都没有接受正确的做法。

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

2 个答案:

答案 0 :(得分:1)

方法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类,该类具有exceptionchilddoes 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方法和额外的参数。