Java の例外を使用して抽象メソッドを偽装する
-
23-12-2019 - |
質問
私はこのような質問をされたことがありますが、率直に言って困惑しています。
抽象メソッドを記述する代わりに、次のように例外を使用してそれらを偽装することもできます。
public int someMethod(int someparameter) {
throws new RuntimeException("unimplemented");
}
これを行う目的は何でしょうか?また、上記が偽装しようとしている抽象メソッドのコードの例を誰かが提供できますか?ご協力をよろしくお願いいたします。ありがとう。
解決
(おそらく) 有効な使用例が 1 つ思いつきます。抽象クラスと、それを拡張したプロジェクト全体の他のクラスが多数あります。(または、抽象クラスはオープンソース ライブラリ内にあるため、世界中の他のどのクラスがそこから拡張されるかわかりません。) ここで、このクラスに新しい抽象メソッドを追加すると便利であることがわかりました。しかし、追加すると abstract
メソッドをクラスに追加すると、既に拡張されている他のクラスはすべて破壊されます。これらのクラスは、新しいメソッドのオーバーライドを含めるように変更する必要があるためです。したがって、場合によっては、それらを非抽象メソッドとして追加し、万が一の場合に備えて例外をスローさせる方がより現実的であると考えられることがわかります。 新しい それを拡張するクラスは新しいメソッドを使用しますが、オーバーライドするメソッドを書き忘れます。コンパイル時には捕捉されませんが、少なくともテスト中に捕捉される可能性があります。
新しい抽象クラスを定義することもできるため、この理由がどれほど正当であるかはわかりません。 NewImprovedWhatever
これは古いメソッドを拡張して、新しいメソッドを含めます。ただし、それ自体がメンテナンス上の課題を引き起こす可能性があります。よくわからない。
Java が抽象クラスを定義していることに気づきました java.net.SocketImpl
, 、2 つの非抽象メソッドが含まれています。 shutdownInput()
そして shutdownOutput()
, 、デフォルトの実装では例外がスローされます。
protected void shutdownInput() throws IOException {
throw new IOException("Method not implemented!");
}
コメントは、それらが 1.3 で追加されたことを示しているため、おそらくそれがこの方法で行われた正確な理由です。すでに拡張されている他のクラスの変更を必要としないため SocketImpl
. 。しかし、確かなことはわかりません。
いずれにせよ、クラスが最初からそのように設計されていた場合、このような設計は間違いなく非常に悪いコードになるでしょう。しかし、授業で学ぶ優れた O-O の概念は、既存のコードを変更する必要がある場合、実際には必ずしも優れているとは限りません。
他のヒント
これをする目的は、悪いコードを書くことです。
読者を混同して自分のコードを通過する苦しみを感じたい場合は、そのようなコードを書き込みます。
それはまたコードのデザインのスキルの欠如を示しています。
不十分に書かれたAPIはそのようなコードを持つでしょう。
そうしないでください。