オンラインフォーラムで誰かがJavaの静的例外チェックは素晴らしくなく、スケーラビリティとバージョン管理の問題を引き起こすと述べました。
新しい例外をスローするクラス関数の変更を考えました。クライアントコードの破損は、バージョン管理の問題に起因する可能性があります。しかし、私にはわかりません。
静的例外チェックのスケーラビリティの問題は何ですか?
動的例外チェックとは何ですか?
オンラインフォーラムで誰かがJavaの静的例外チェックは素晴らしくなく、スケーラビリティとバージョン管理の問題を引き起こすと述べました。
新しい例外をスローするクラス関数の変更を考えました。クライアントコードの破損は、バージョン管理の問題に起因する可能性があります。しかし、私にはわかりません。
静的例外チェックのスケーラビリティの問題は何ですか?
動的例外チェックとは何ですか?
Javaでチェックされた例外は、プログラマーがメソッドに適した例外をスローできない場合にスケーラビリティの問題を引き起こす可能性があります。(Effective Java、アイテム43:抽象化に適切な例外をスローするを参照してください)。
throws
怠惰なプログラマーは、適切かどうかを考慮せずに、メソッドの句に例外を追加する傾向があります。その結果、アプリケーションアーキテクチャで高く見えるにつれて、メソッドはますます多くの例外を収集します。注意しないと、トップレベルのメソッドは10個以上の例外をスローする可能性があります。
たとえば、データを暗号化するように設計された方法では、多くの低レベルの例外がスローされる可能性があります(たとえば、、、... IOException
)。これらをAPIユーザーに公開する必要はありません。代わりに、例外がスローされ、例外のフィールドに残酷な詳細が格納される可能性があります。NoSuchAlgorithmException
KeyNotFoundException
EncryptionFailed
cause
「動的例外チェック」とは、外部刺激に基づいて、Throwable
または(ルートクラスの1つ)をキャッチし、例外を処理するかどうかを動的に決定することを指していると思います。Exception
例えば:
List<Class<?>> exceptionTypes = new ArrayList<>();
exceptionTypes.add(IllegalArgumentException.class);
exceptionTypes.add(IOException.class);
try {
// do something
} catch (Exception e) {
if (exceptionTypes.contains(e.getClass())) {
e.printStackTrace();
}
}
注:上記の例は単なる例示です。しかし、ユーザーに代わってコードを実行し、キャッチしたい例外クラスをユーザーが選択できるようにするIDEを想像してみてください。
動的例外チェックは、実行時に例外を発生させる別の名前だと思います。
私は静的例外チェックを信じていますが、静的例外チェックのJavaの方法には、実際にはインターフェースの実装に関係する問題があります。
言う、私たちは持っていIParser
ます。そのメソッドparse()
がスローする可能性のある適切な例外は何ですか?おそらくSyntaxErrorException
。ここで、を次のServerResponseParserFromURL
ように使用する必要があります。
class ServerResponseParserFromURL implements IParser { .... };
....
try {
IParser parser = new ServerResponseParser(new URL("http://example.com/test.htm"));
parser.parse();
....
}
ここに問題があります—の実装はIParser
、たとえば、発火する可能性がありNoRouteToHostException
ます。したがって、簡潔で簡潔な形式を使用することはできず、長い形式にフォールバックする必要があります。
class ServerResponseParser implements IParser { .... };
....
try {
String response = getServerResponse(new URL("http://example.com/test.htm"));
IParser parser = new ServerResponseParser(response);
parser.parse();
....
}
ご覧のとおり、実際には、私たちIParser
はIStringParser
一般的なものではなく、IParser
です。
この特定のケースでは許容できるかもしれませんがIParser
、関数の引数の1つとしてを指定する場合は複雑になりますf
。たとえば、URLで識別されたサーバーの応答を解析できるようにするには、ServerResponseParser
オブジェクトとURLをフィードするだけではなく、メソッドをにフィードするgetServerResponse
方法を見つける必要がありますf
。