次のインターフェースを検討してください。
public interface Generator {
String generate() throws IOException;
}
および次の実装:
public class EmptyStringGenerator implements Generator {
@Override
public String generate() {
return "";
}
}
インターフェイスthrows IOException
で指定された署名の一部を省略したことに注意してください。Generator
それでも、コンパイラ エラーやコンパイラ警告はなく、@Override
注釈も文句を言いません。
これが意図したとおりに機能していることは承知しています。ただし、この背後にある意図を知りたいと思います。私のメソッドが実際に をスローしない場合は、スローしないIOException
だけで問題ありません。署名から削除する必要はありません。しかし、 のメソッド シグネチャからそれを削除するとEmptyStringGenerator
、このクラスの現在および将来のすべてのサブクラスが、インターフェイスで実際に指定されている例外をスローする可能性を放棄することになります。
私には、これは実際には何のメリットももたらさない機能のように思えますが (2、3 のキーストロークを節約することは別として、これはまったくメリットではありません)、実際に使用するとひどい間違いになる可能性があります。
私の質問は、事実上、次のとおりthrows
です。派生クラスで例外を省略することのポイントは何ですか? この可能性が解決する問題は何ですか? なぜこれが許可されているのですか?
アップデート
「しかし、それのどこに害があるのですか?」と尋ねる人のために、私のコメントの1つからの私の例を次に示します. ちなみに、それはまさに私が今扱っているものなので、大げさではありません。
プログラマー A はインターフェイス I を指定します。プログラマー B は実装クラス X を記述しますが、スローを追加するのを忘れます。ここでは警告すら出されていないので、彼も決して気づきません。プログラマー C は、クラス X から継承する実装クラス Y を作成します。彼は、スローするつもりなので、そこにスローを配置することも特に望んでいます。しかし、インターフェイスにはそれが規定されていますが、B の見落としにより、彼はもはやそうすることが許可されていません。ここでその例外を使用することは事実上許可されていません。それはかなり大きな害です。特にクラスXがあなたの管理下にない場合。