3

昨日、LinkedList の独自の実装をコーディングしていました。私はこのようなことをしていました:

public class Node
{
    Node next;
    int value;

    public Node()
    {
       next = null
       value = 0;
    }
}

それからNode私がやっていたときを使用するnode.nextnode.value。それから私は気づきました-待って、一体私は何をしているのですか?これらのインスタンス変数は、privateと のように getters() と setters() でアクセスする必要がgetNext()ありsetValue()ます。

これにより、インスタンス変数以外のものがいつ必要になるのか疑問に思いました。private

4

4 に答える 4

1

任意のアクセスや変更からそれらを実際に保護する必要がない場合(値が任意の整数を取ることが許可されている場合、または「取得された値」から「オブジェクト内の値」への単純な null マッピングなど)、ほとんど意味がありません。ゲッターまたはセッターをラップします。

その場合、次のコードを使用すると、コードがより自然に見えることがあります。

object.value = 42;

それよりも:

object.setValue (42);

(私の目との違いは最小限ですが)。

そうは言っても、将来のある時点でメンバーにロジックを組み込む必要がある場合、パブリックメンバーをそのメンバーのゲッター/セッターに変更すると、そのクラスのAPIが壊れ、変更が必要になるため、私はまだゲッターとセッターを好みますご利用のすべてのお客様へ。

これには以下が含まれます (ただし、これらに限定されるものではありません)。

  • メンバーに設定できる値を制限します。たとえば、オブジェクトの年齢を 0 ~ 137 億年に制限する :-)
  • 摂氏メンバーから華氏温度を計算するなど、抽出される値を導出します。
  • 一部のファイルをキャッシュにプリロードしてファイル名を変更するなど、値の設定に副作用があります。
于 2013-11-07T01:00:40.170 に答える
1

古典的な例は、2 次元の数学的点を表すクラスです。

public class Point {
    public float x;
    public float y;

    public Point( float x, float y ) {
        x = x;
        y = y;
    }

    public void scale( float c ) {
        x *= c;
        y *= c;
    }

    public void rotate( float angle, Point center ) {
       // whatever this logic is; I forget
    }   
}

APointは実際には、任意に変化できる 2 つの float の単なるコンテナーです。ユーザーにゲッターとセッターを強制的に通過させるのではなくx、直接アクセスを許可することで、実際には何も害を及ぼすことはありません。y同時に、スケーリングや回転などの一部の操作は十分に一般的であるため、座標で必要な計算を行うためのメソッドを提供するクラスを作成する価値があります。


コード内の構文またはその他のエラーを許してください (または、できれば修正してください)。私は何年も Java を書いていません。

于 2013-11-07T01:03:26.710 に答える
0

Java のアクセス指定子を確認する必要があります。クイック リファレンス: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2013-11-07T00:59:19.287 に答える