Java でプライベート変数のセッター メソッドがある場合、変数をプライベートにする目的は何ですか?
ユーザーがインスタンスの状態に直接アクセスしないように制限するためのプライベート変数があります。しかし、場合によっては、対応するセッター メソッドとゲッター メソッドを使用して、プライベート変数の状態にアクセスして変更することもあります。もしそうなら、なぜ変数を非公開にするのでしょうか? 代わりにパブリック変数を持つことができますよね?
理論的根拠は、実装を隠しているということです。電話するとき
setX(23);
対応する変数x
はクライアントクラスから隠されており、直接監視または変更することはできません。
なぜこれが良いのですか?
x
後日、(たとえば)、string
などに変更できdouble
、クライアントコードを変更する必要はありません。x
消えることさえあり、呼び出しsetX()
は実際にはいくつかの異なるが同等の機能を実行します。x
無効な(たとえば負の)値に設定するのを防ぐことはできません。x
が存在します(またはそれがaの場合)。慣例に従うことで、クラスはこれらのフレームワークとうまく相互運用できます。getX()
setX()
isX()
boolean
セッターを持たず、不変オブジェクトを実装するための引数があることに注意してください(したがって、コンストラクターのみを使用して値を設定します)。これにより、オブジェクトはスレッドセーフになり、オブジェクトの状態に関するデバッグ/推論が容易になります。
セッターがあるかどうかの問題ではなく、カプセル化の問題です。実装を隠すために、メンバー変数はほとんどの場合プライベートにする必要があります。
私が最近見た良い例を次に示します。Java に型がない理由を誰かが尋ねたところ、別の誰かが、 と の間を行き来するちょっとしたトリックをAtomicFloat
使用して実際に実装できると指摘しました。クラスは次のようになりました。AtomicInteger
int
float
class AtomicFloat {
private AtomicInteger value;
public float get() {
// turn value into float
}
public void set(float newValue) {
// turn newValue into int
}
// CAS and whatever else
}
外から見ると、必要なものはすべて揃っているように見えます。このクラスを として使用できAtomicFloat
、内部で何が起こっているかは気にしません。ここで、ユーザーがのぞき見して、すべてのメソッドが実際にAtomicInteger
. それは本当に物事を台無しにするでしょう!
発信者が愚かなことをするのを止める。Date クラス (Java の Date クラスでも Jodatime の Date クラスでもない単純なもの) を想像してみてください。このクラスは、日付、月自体、および年自体を int フィールドに格納します。
public int dayOfMonth;
public int monthOfYear;
public int year;
これにより、呼び出し元が 1 年の 56 か月目の 234 日にこの Date クラスのインスタンスを作成するのを止めるものは何もありません。
一方、プライベート フィールドにセッター メソッドを使用する場合、これらのセッター メソッドは、渡される値が適切であることを確認できます (たとえば、setMonth()
1 から 12 の範囲外の値で呼び出されていないなど)。
setter
はミューテーター メソッドであり、ミューテーター メソッドは に使用されるメソッドですcontrol changes to a variable
。
しかし、他のクラスからのprivate
修飾子は、プライベート修飾子ではなくセッターを定義するだけ
でパラメーターを作成できますcontrols the accessiability of a variable
write-only
この方法論は、たとえば次の場合によく使用されます。
Class Car {
Private int wheels
Private int tyres
Private time lastUpdated
- setWheels(int i) {
lastUpdated = Time.Now
wheels = i
tyres = i
}
- setTyres(int i) {
lastUpdated = Time.Now
tyres = i
wheels = i
}
}
その変数が更新されたときに、それに依存する他のことも実行したいとします。
これは単純な例であり、ホイールの数はタイヤの数に直接関連しているため、setter メソッドを使用するときにそれを設定でき、車が最後に更新された時期も知りたい場合、基本的に他の操作を実行できます。変数の変化に依存するタスク。
変数をプライベートにする理由は、クラスの外部から変数にアクセスするときにセッター メソッドを使用する必要があるためです。
お役に立てれば。
ありがとう、ウィル