JavaRush /Java Blog /Random-JA /最終的な Java メソッドとクラス
articles
レベル 15

最終的な Java メソッドとクラス

Random-JA グループに公開済み
クラス メソッドに modifier を指定することはfinal、派生クラスが内部実装を変更してこのメ​​ソッドをオーバーライドできないことを意味します。言い換えれば、私たちはメソッドの最終バージョンについて話しているのです。クラス全体を としてマークすることもできますfinal最終的な Java メソッドとクラス - 1
final class NoExtending {
// …
}
としてマークされたクラスはfinal継承できず、そのすべてのメソッドが間接的にプロパティを取得しますfinal。クラスおよびメソッドの宣言でこの機能を使用すると、finalコードのセキュリティのレベルを高めることができます。クラスに modifier が装備されている場合final、誰もクラスを拡張できず、おそらくその過程でそのコントラクトを破ることができます。記号がfinalメソッドを示している場合、「偽造」を恐れることなく、あらゆる状況でその内部実装を完全に信頼できます。finalたとえば、メソッドが当初意図したものが正確に実行されることを保証するために、ユーザーが入力したパスワードの検証を必要とするメソッドの宣言で を使用するのが適切です。攻撃者は、そのようなメソッドのオーバーライドされたバージョンをプログラムに「滑り込ませる」ことによって、そのようなメソッドの元の実装を変更することはできません。たとえば、パスワードに関係なく、常にユーザーの登録が成功したことを示す値 true を返します。彼は実際に入った。final特定の状況が許せば、さらに進んでクラス全体をクラスとして宣言する権利があります。メソッドはValidatePassword同じプロパティを間接的に取得します。メソッドまたはクラス宣言で修飾子を使用すると、finalコードのさらなる使用および開発の可能性に重大な制限が課されます。final宣言内でのメソッドの使用は、メソッドの実装が自己完結型で完全に完了していることを確実に示します。あなたのクラスを使用して、自分のニーズに合わせてその機能を拡張したい他のプログラマは、目的を達成するための手段の選択が制限されるか、完全に奪われてしまいます。finalクラスを全体としてマークすると、クラスの継承機能が無効になり、他のクラスに対する有用性が大幅に低下する可能性があります。修飾子を使用しようとしているときはfinal、そのような犠牲を払う準備ができているかどうか、また、犠牲を払う価値があるかどうかを確認してください。多くの場合、十分なレベルのコード セキュリティを達成するために、クラス全体を指定する必要はありません。 「重要な」構造要素のみfinalを修飾子でマークすることで、クラスの拡張性を維持することは十分に可能ですfinal。この場合、クラスの主要な機能をそのまま残し、同時に新しいメンバーを追加してその継承を許可しますが、「古い」メンバーを再定義することはありません。もちろん、メソッドのコードによってアクセスされるフィールドは、いずれかfinalに指定する必要があります。そうしないと、派生クラスがその内容を変更でき、対応するメソッドの動作に影響を与えることになります。修飾子を使用することのもう 1 つの効果は、コンパイラーによって解決されるコード最適化問題の単純化に関連しています。としてマークされていないメソッドが呼び出された場合、これが起こります。finalprivatefinalfinal、ランタイム システムはオブジェクトの実際のクラスを決定し、呼び出しをオーバーロードされたメソッドのグループからの最も適切なコードに関連付け、制御をそのコードに渡します。しかし、たとえば、前に説明したgetNameクラスの例のメソッドがAttrとして指定されていた場合final、それを呼び出す操作は大幅に簡素化された可能性があります。に関するような最も単純なケースではgetName、コンパイラはメソッド呼び出しをその本体コードに単純に置き換えることができます。このメカニズムはコードのインライン化と呼ばれます。このメソッドのインライン バージョンを使用する場合、getName次の 2 つの式はまったく同じように実行されます。
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
上記の式は同等ですが、2 番目の式には依然として利点があります。このメソッドを使用すると、getName名前フィールドに読み取り専用プロパティを与えることができ、クラス コードにある程度の抽象化を持たせることができるため、より自由に変更できるようになります。クラスの実装。および メソッドもオーバーライドを許可しないため、コンパイラによって同じ最適化スキームをprivateおよびメソッドに適用できます。statiсクラス宣言で修飾子を使用すると、final一部の型チェック操作も効率的になります。この場合、そのような操作の多くはコンパイル段階ですでに実行できるため、潜在的なエラーははるかに早い段階で検出されます。コンパイラがソース テキスト内でクラスへの参照を検出した場合final、対応するオブジェクトが指定された型であることは「確実」です。コンパイラは、クラス階層全体の中でクラスが占める位置を即座に判断し、それが正しく使用されているかどうかを確認できます。修飾子finalが適用されていない場合、対応するチェックはプログラムの実行段階でのみ実行されます。 演習3.4。vehicle クラスと旅客車両クラスのメソッド宣言 (含める場合はどの宣言) にFinal修飾子を含めることをお勧めしますか? 元のソースへのリンク: http://src-code.net/metody-i-klassy-final-java
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION