7

Java でプライベート変数のセッター メソッドがある場合、変数をプライベートにする目的は何ですか?

ユーザーがインスタンスの状態に直接アクセスしないように制限するためのプライベート変数があります。しかし、場合によっては、対応するセッター メソッドとゲッター メソッドを使用して、プライベート変数の状態にアクセスして変更することもあります。もしそうなら、なぜ変数を非公開にするのでしょうか? 代わりにパブリック変数を持つことができますよね?

4

5 に答える 5

14

理論的根拠は、実装を隠しているということです。電話するとき

setX(23);

対応する変数xはクライアントクラスから隠されており、直接監視または変更することはできません。

なぜこれが良いのですか?

  1. 実装を非表示にします。x後日、(たとえば)、stringなどに変更できdouble、クライアントコードを変更する必要はありません。x消えることさえあり、呼び出しsetX()は実際にはいくつかの異なるが同等の機能を実行します。
  2. セッター関数を実装することで、検証などを実施できます。そうでない場合、誰かがx無効な(たとえば負の)値に設定するのを防ぐことはできません。
  3. (これは、一般的なOOの利点ではなく、Java固有の利点です)。多くのJavaフレームワークは、JavaBeans規則を使用してオブジェクトを処理します。つまり、プロパティの場合、対応する/xが存在します(またはそれがaの場合)。慣例に従うことで、クラスはこれらのフレームワークとうまく相互運用できます。getX()setX()isX()boolean

セッターを持たず、不変オブジェクトを実装するための引数があることに注意してください(したがって、コンストラクターのみを使用して値を設定します)。これにより、オブジェクトはスレッドセーフになり、オブジェクトの状態に関するデバッグ/推論が容易になります。

于 2012-09-26T12:05:55.937 に答える
1

セッターがあるかどうかの問題ではなく、カプセル化の問題です。実装を隠すために、メンバー変数はほとんどの場合プライベートにする必要があります。

私が最近見た良い例を次に示します。Java に型がない理由を誰かが尋ねたところ、別の誰かが、 と の間を行き来するちょっとしたトリックをAtomicFloat使用して実際に実装できると指摘しました。クラスは次のようになりました。AtomicIntegerintfloat

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. それは本当に物事を台無しにするでしょう!

于 2012-09-26T12:08:09.420 に答える
0

発信者が愚かなことをするのを止める。Date クラス (Java の Date クラスでも Jodatime の Date クラスでもない単純なもの) を想像してみてください。このクラスは、日付、月自体、および年自体を int フィールドに格納します。

public int dayOfMonth;
public int monthOfYear;
public int year;

これにより、呼び出し元が 1 年の 56 か月目の 234 日にこの Date クラスのインスタンスを作成するのを止めるものは何もありません。

一方、プライベート フィールドにセッター メソッドを使用する場合、これらのセッター メソッドは、渡される値が適切であることを確認できます (たとえば、setMonth()1 から 12 の範囲外の値で呼び出されていないなど)。

于 2012-09-26T12:10:41.893 に答える
0

setterはミューテーター メソッドであり、ミューテーター メソッドは に使用されるメソッドですcontrol changes to a variable
しかし、他のクラスからのprivate修飾子は、プライベート修飾子ではなくセッターを定義するだけ でパラメーターを作成できますcontrols the accessiability of a variable
write-only

于 2012-09-26T12:12:05.657 に答える
0

この方法論は、たとえば次の場合によく使用されます。

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 メソッドを使用するときにそれを設定でき、車が最後に更新された時期も知りたい場合、基本的に他の操作を実行できます。変数の変化に依存するタスク。

変数をプライベートにする理由は、クラスの外部から変数にアクセスするときにセッター メソッドを使用する必要があるためです。

お役に立てれば。

ありがとう、ウィル

于 2012-09-26T12:12:20.227 に答える