私はgetメソッドとsetメソッドを学んでいますが、これらがパブリックにしかできないのか疑問に思っていました.クラス内のすべてのインスタンス変数に対して記述する必要がありますか?
8 に答える
いいえ。
計算の状態など、多くの内部変数は決して編集してはなりません。
フィールドがプライベートでゲッター/セッターがない場合、それは理由があってそのようになっており、クラス外でアクセスする必要がない限り許容されます。
公開されている場合は意味がありません。保護されている場合は、パッケージごとであるか、必ずしも同じパッケージ内にあるとは限らないサブクラスです。
修飾子がなければ、パッケージ プライベートです。
フィールドを非公開にし、getter/setter を制御したい場合は、アクセス レベルも使用できます。
その上で、必要に応じて、セッター内で検証を実行して、許容値のみが設定されていることを確認できます。次に、黙って拒否するか、setter がブール値の場合は false を返すか、厳しい状況では例外をスローします。
Java の get メソッドと set メソッドは、通常のメソッドです。である必要はありませんがpublic
、そうでないとあまり役に立ちませんpublic
。
クラス内のインスタンス変数ごとに記述する必要はありません。値が他の値に依存するインスタンス変数がある場合、totalPrice
インスタンス変数に依存するインスタンス変数など、セッターを持つことは意味がない場合がありquantity
ます。
変更してはならないインスタンス変数、つまり不変のインスタンス変数が必要な場合は、 set メソッドをまったく提供しないでください。
これらのメソッドは、呼び出し元へのインターフェイスを提供します。それらは、許可するオブジェクトに対する操作を提供するため、呼び出し元が値を無効な状態に設定することはできcount
ませ-1
ん。これは「カプセル化」であり、オブジェクトの実装を呼び出し元から隠します。latitude
91
ゲッターとセッターを公開するための Java ルールはありませんが、これらは何らかの理由で公開されています。ゲッターとセッターのポイントは、取得または設定するプライベート変数にアクセスするためにのみ使用されることです。この方法でカプセル化を提供すると、後でコードをリファクタリングまたは変更するのがはるかに簡単になります。ゲッター関数とセッター関数を使用すると、制約とカプセル化が可能になります。xが半径だとしましょう。shape.x = -10 はあまり意味がありません。また、誰かが不正な値を設定しようとした場合、エラーを出力するか、デフォルト値を設定するか、何もしないことができます。メンバー変数を非公開にして、それを使用するプログラムが直接変更できないようにすることをお勧めします。
ゲッターとセッターの使用法に関する良い記事:
http://java.dzone.com/articles/getter-setter-use-or-not-use-0
get メソッドと set メソッドは、もともと JavaBeans 用に設計されたもので、IDE とアプリケーション プログラムが、クラスが持つプロパティとサポートするイベント リスナーを検出できるように様式化されたクラスです。イントロスペクションと呼ばれる限られたバージョンのリフレクションを通じて、ツールはクラスを分析できます。プログラマーがメソッドを使用したくない場合でも、代わりに使用するis/get/set
メソッドを示すクラスを作成できます。BeanInfo
のJavadocを見てくださいjava.beans.Introspector
。とjava.beans.BeanInfo
。これにより、他のツールに公開されるメソッドやプロパティに関するメタデータなど、追加情報を文書化する方法が提供されます。たとえば、TemperatureGauge
クラスは最小温度と最大温度を公開できるため、Swing プログラムは、プログラマーが情報を調べなくてもスライダーの制限を設定できます。
それでも、露出しなければならない以上に露出するべきではありません。ゲッターとセッターへのアクセスを制限する必要がある場合があります。データベースツールには必要かもしれませんが、通常のプログラミングでプロパティに触れたくないかもしれません。これは、メソッドが特定のパッケージに限定されている OSGI やプロキシなどのアイデアにつながります。
たとえば、一般的な戦術の 1 つは、getter のみを使用し、変数を final としてマークし、コンストラクターでオブジェクトを構築することです。例えば、
public final class Complex {
private final double re;
private final double im;
public Complex(double re, double I'm) {
this.re = re;
this.im = im;
}
public double getReal() {
return re;
}
// more getters, arithmetic, etc.
}
メソッドの名前は、変数とは少し異なることに注意してください。大丈夫。
一方、getter を避けて、オブジェクトに何をすべきかを伝えるメソッドを記述するプログラミング スタイルがあります。インスタンス変数を持つName
クラスを考えてみましょう。次に、このメソッドを追加します。givenName
surname
public void writeFormally(Appendable app) {
app.append(surname)
.append(", ")
.append(givenName);
}
これは、GWT やそのHasText
インターフェースなどの Model-View-Presenter システムで時々見られます。
依存性注入システムを扱うコードや、オブジェクトがデータベースと通信するためにリフレクションを使用するコードを作成している場合を除き、getter と setter の詳細について心配する必要はありません。当然のことを行い、オブジェクトの露出を制限してください。また、書きたくなるたびに、次のように書きます。
x.getA().getB().getC().setZ(42);
get と set のチェーンを取り除くためにコードを書き直してください。The Pragmatic Programmerで Demeterの法則を調べてください。
カプセル化について話していると思います。
これらのメソッドの要点は、変数の値をアプリケーションの別の場所に渡すことができるように、それらをパブリックにすることです。
多くの変数でこれを達成するために、これらの get および set メソッドの多くを含むカスタム クラスで動作する基本的にカスタム インターフェイスである「リスナー」(オブザーバー パターン理論) の使用を検討することができます。
カプセル化の詳細: http://en.wikipedia.org/wiki/Encapsulation_(object-directional_programming)
オブザーバー パターン理論の詳細 http://www.youtube.com/watch?v=UEtyGP994X0
オブジェクトがJavaBeanとして機能するには、パブリックのゲッターとセッターが必要です。
オブジェクトに JavaBean の要件がない場合は、クラスに public getter (および特に setter ) を提供する必要はありません。
子クラスだけがフィールドにアクセスできるようにする場合は、protected を使用します。ただし、他のクラスがフィールドにアクセスする必要がある場合は、public が適しています。アクセスの範囲に基づいて決定する必要があります。