11

私はインタビューでこの質問をされました。

私はメソッドを持っています、public int add(int i, int j)そしてこのメ​​ソッドはすでに多くのクライアントによって使用されています。

ここで、例外をスローする必要があるシナリオを作成するaddメソッドを更新する必要があります(拡張機能の可能性があります)。add()既存のクライアントに、コードを最後から変更せず にメソッドを引き続き使用させるにはどうすればよいですか?[インタビュアーはヒントを与えました:クライアントは、addメソッドで行った新しい拡張機能を使用する場合と使用しない場合があります]

まず、addをオーバーロードし、addを新しいaddメソッドでラップして例外をスローすることを考えました。それから私RuntimExceptionはaddからのように例外を投げることを考えました...

しかし、それらのどれも正しいアプローチとして受け入れられませんでした。

私が見逃しているパターンやデザインのアプローチはありますか?

4

2 に答える 2

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メソッドを持つクラスとexception、親からメソッドをオーバーライドするクラスを宣言することです。ここで、クライアントに例外を使用させたい場合は type で参照を渡し、それ以外の場合は type で参照を渡します。childdoes not have the exceptionaddAB

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

新しいクライアントは、追加のパラメーターを指定して新しい add メソッドを使用できます。

于 2013-06-25T21:09:43.290 に答える