1

保護されたメソッドが、定義クラスから継承していないクラスからアクセスできるという事実は、常に私を悩ませてきました。サブクラスが機能の一部を定義できるようにするために、抽象クラスで抽象保護メソッドを頻繁に使用します。これらは実質的にプライベート メソッドであり、クラス階層の外で呼び出されることは意図されていません。ただし、保護されたメソッドはパッケージ内の任意のクラスから呼び出すことができるため、Java ではこれを言う方法がありません。

私の質問は、これを許可する設計上の根拠は何ですか? パッケージ内またはパッケージ外のランダムなサブクラスでのみ呼び出すことができるメソッドを必要とする有効なユースケースはありますか? 私はこのケースに出くわしたことがなく、他の人が持っているかどうか疑問に思っています.

4

2 に答える 2

1

大規模なプロジェクトでは、テスト クラスがテスト対象のクラスで内部メソッドを呼び出すことは非常に一般的であり、保護またはパッケージ レベルのアクセスによってこれが可能になります。

私の意見では、protected修飾子は、コードをカプセル化するための強制メカニズムというよりは、ドキュメンテーション機能です。メソッドまたはフィールドを保護済みとしてマークすることにより、問題のコードが、そのクラスの公開 API の一部ではなく、将来のバージョンで変更される可能性のある内部実装の詳細であることを他の開発者に示すことになります。

キャストとリフレクションにより、他の開発者は、意図しないコードにアクセスできることがよくあります。メソッド呼び出しが他のクラスから呼び出された場合に有害である可能性がある場合、解決策は、Java のアクセス ルールを使用してメソッドをロックダウンしようとすることではありません。クラスをリファクタリングして、不変のデータ構造と懸念事項の明確な分離を優先することです。

于 2012-06-22T20:15:40.810 に答える
0

この問題の解決策は、プロジェクトを再編成して複数のパッケージを含め、各パッケージにスーパークラスとそのサブクラスだけが含まれるようにするようなものです。これは、困難で迅速な解決策というよりも回避策ですが、やりたいことを実行する必要があります。

于 2012-06-22T19:52:36.057 に答える