私はJavaを学んでいます。現在、クラス内のフィールドをプライベートにし、変数にアクセスまたは変更するための要件に従って get および set メソッドを提供することは、常に oop の慣行です。ここで私の質問は、プライベートと宣言されたフィールドの set メソッドがある場合、ユーザーは非表示であってもフィールドの値を変更できるということです。では、set メソッドを提供する代わりに、フィールドを public にしてみませんか?
3 に答える
あなたは正しいです-セッターとゲッターは適切なプロパティの値を変更できます。では、なぜそれらが必要なのですか?
ここでいくつかの理由を列挙しようと思います。
- コードの保守が簡単です。誰がプロパティを変更したかを簡単に見つけることができます。すべてのセッターコールを探してください。それ以外の場合は、プロパティを参照するすべての場所を検索し、99%の場所でプロパティを読み取り、1%で書き込みを行うことができます。
- デバッグが簡単です。探しているものに応じて、getterまたはsetterにブレークポイントを設定できます。
- setterとgetterがメソッドであるという事実は、最新の複雑なフレームワークでのバイトコードエンジニアリングとプロキシ作成で使用されます。
クラス内のフィールドをプライベートにし、変数にアクセスまたは変更するための要件に従ってgetメソッドとsetメソッドを提供することは、常にoopの慣例です。
変数はプライベートに保つのが最適です(ただし、パブリックに保つことはできます)。すべての変数がgetおよびset(アクセサーおよびミューテーター)関数を必要とするわけではありません。ユースケースによって異なります。たとえば、クラスの内部にあるある種のカウントを保持している場合、set(..)メソッドを提供しません。get(..)メソッドとset(..)メソッドが戻りと割り当て以外の何もしない場合は、会社のコーディングガイドラインに従うことをお勧めします。そして、オプションがある場合は、ゲッターとセッターを選択してください。
ここで私の質問は、プライベートとして宣言されたフィールドのsetメソッドがある場合、ユーザーはフィールドが非表示であってもフィールドの値を変更できるということです。では、setメソッドを提供する代わりに、フィールドを公開してみませんか?
ここでの非常に単純で些細な例:
void setVar(string x){
myPrivateVar = x;
//log the change..
writeToLog("myPrivateVar was updated to: " + x + " at <blah blah>");
//inform others of the change.
updateDependantConfiguration();
}
HTH..
カプセル化について読んでみると、その理由をよりよく理解できます。