web-dev-qa-db-ja.com

Checkstyle「拡張用に設計されていないメソッド」エラーが誤って発行されますか?

Checkstyleを使用していて、このメソッドに関するエラーが発生します。

public final String getAdmitCodeStatus() {
    return admitCodeStatus;
}

ここに私が得るエラーがあります:

メソッド「getAdmitCodeStatus」は拡張用に設計されていません-抽象、最終、または空である必要があります。

その方法はどのように準拠していませんか? Checkstyleがこの方法について私に怒鳴るという私が間違っていることはありますか?

31
McGlone

DesignForExtensionルールが原因であると思われます。 ドキュメント によると:

クラスが拡張用に設計されていることを確認します。具体的には、スーパークラスがサブクラスによって実装できる空の「フック」を提供するプログラミングスタイルを適用します。

正確なルールは、サブクラス化できるクラスの非プライベートで非静的なメソッドは、

abstract or
final or
have an empty implementation

理論的根拠:このAPI設計スタイルは、スーパークラスをサブクラスによって壊されることから保護します。欠点は、サブクラスの柔軟性に制限があることです。特に、スーパークラスでのコードの実行を妨げることはできませんが、スーパークラスの呼び出しを忘れてサブクラスがスーパークラスの状態を破壊することはできません。

出典: http://sonar.15.n6.nabble.com/design-for-extension-rule-tp3200037p3200043.html

しかし、あなたのメソッドにはfinal修飾子があるので、バグを発見し、バグレポートを記録したいと思うかもしれません。 https://github.com/checkstyle/checkstyle/issues

31
Snekse

一見すると、これは一体全体のプログラミングスタイルのように見えます...これは、継承するメソッドを計画しているかどうかをチェックするだけです...そして、それらを宣言できますfinal,abstract or empty implementation.次に、それをfinalと宣言します...;)要件のシナリオに応じて、クラスはfinalにすることも、メソッドを個別にすることもできます。

1
Alind Billore

このチェックは役に立ち、ほとんどの場合警告は正当化されます。時にはそれは適切ではないので無視します。

0