24

classVariable.name = ""クラスで get および set メソッド (getName,setName ) を使用するタイミングと、代わりに単純なタイミングを知りたいа = classVariable.getName()

set メソッドと get メソッドを使用したクラスの例を次に示します。

public class ClassExampe {

    String name;
    String course;

    public String getName ( )
    {
        return name;
    }

    public void setName (String studentName)
    {
        name = studentName;           
    }

    public String getCourse ( )
    {
        return course;
    }

    public void setCourse (String studentCourse)
    {
        course = studentCourse;
    }
}

ありがとう

4

9 に答える 9

37

ゲッター/セッターの使用とフィールドの使用

経験則として:

同じクラスから変数を直接使用し (実際には同じ .java ファイルから、内部クラスも問題ありません)、他のクラスから Getters / Setters を使用します。

于 2010-11-11T16:46:32.133 に答える
22

簡単なルールは、直接アクセスを使用しないことです (もちろん、クラス内からそれらを参照する場合を除きます)。

  • フィールド アクセスはプロキシできません
  • イベント通知が必要な場合があります
  • 競合状態を防ぎたい場合があります
  • 式言語はセッターとゲッターをサポート
  • 理論的には、これはカプセル化を破ります。(ただし、すべてのフィールドのセッターとゲッターもカプセル化を破ります)
  • セッターまたはゲッター内で追加のロジックを実行したい場合がありますが、消費者はこれが規則に従うこと、つまり単純なゲッター/セッターであることを期待しているため、これはほとんどお勧めできません。
  • セッターのみまたはゲッターのみを指定して、読み取り専用または書き込み専用アクセスを実現できます。

これらのいずれかが必要になることが起こらなくても、可能性は低くありません。また、フィールド アクセスから始めると、変更が難しくなります。

于 2010-11-11T16:46:11.783 に答える
10

Java では、通常、getter と setter を使用することがベスト プラクティスと見なされます。

これは、プロパティがアクセスまたは変更されたときにコードを変更して別のことを行う必要がある場合は、既存のゲッターまたはセッターで変更するだけでよいためです。

単純なオブジェクトが少し乱雑になると思う傾向がありますが、追加機能を追加するためにパブリック プロパティをゲッターとセッターにリファクタリングしなければならなかったことがある場合は、それが面倒なことがわかるでしょう。

于 2010-11-11T16:46:08.367 に答える
6

ほとんどの人は、プライベート メンバーにアクセスするために常にゲッター/セッターを使用するように言うと思います。必須ではありませんが、「ベスト プラクティス」と見なされます。

利点の 1 つは、単純な代入と返却以上のものを使用できることです。例:

public void setLevel(int lvl)
{
    if (lvl<0)
    {
        this.level=1;
    }
    else
        this.level = lvl;
}

public int getLevel()
{
    if (this.someIndicator==4)
        return this.level*7.1;
    else
        return level;
}
于 2010-11-11T16:46:26.597 に答える
3

Getter と Setter を使用すると、後で実装を変更でき (たとえば、より複雑なことを行う)、検証ルールを実装できます (たとえばsetName、名前が 5 文字以下の場合に例外をスローするなど)。

変数が「読み取り専用」のようになるように、セッターではなくゲッターを追加することも選択できます。

これが理論ですが、多くの場合 (セッターを使用する Hibernate など)、セッターで例外をスローできないため、検証を行うことができません。通常、値は単に割り当て/返されます。私が働いていたいくつかの会社では、すべての属性に対して getter と setter を書くことが義務付けられていました。

その場合、オブジェクトの外部から属性にアクセスし、読み取り/書き込み可能にしたい場合は、パブリック属性を使用します。コードが少なくて済むということは、obj.var += 5よりも読みやすいものを書くことができるということですobj.setVar(obj.getVar() + 5)

于 2010-11-11T16:48:40.153 に答える
2

つまり、内部のプライベート変数をパブリックにする代わりにパブリックアクセサーメソッドをいつ使用するかというと、パフォーマンス上の重大な理由がない限り、私の答えは「常に」です。

つまり、独自の get メソッドと set メソッドを呼び出すのと、クラス内の変数への直接アクセスを呼び出すのとでは、独自のアクセス メソッドを呼び出すと言います。このようにして、get/set の一部として実装する変換、編集、またはルールは、外部の呼び出し元だけでなく、独自の内部呼び出しによっても自動的に呼び出されます。

純粋な OO 言語 (たとえば、Smalltalk) には public の概念はありません。すべての内部変数は非公開であるため、アクセサーを使用する必要があります。純粋ではない OO 言語では、物事を公開することができますが、データ構造と実装の内部を公開することは、長期的な安定性と保守にとって非常に悪い考えです。詳細については、「密結合」を参照してください。

簡単に言えば、内部変数を公に公開すると、人々はそれらに直接アクセスでき、名前を変更したり、改行の下にすべてを入力したりすることができます。これを副作用といいます。

于 2010-11-11T16:49:21.750 に答える
1

一般に、セッターとゲッターを使用して、開発者がコードを変更したり、コードを拡張して内部データにアクセスして変更するときに処理と制御のレイヤーを追加したりして、コードを再利用できるようにします。直接アクセスを使用する場合、これはJavaでは不可能です。

括弧:ただし、他の言語、たとえばScalaでは、プロパティとメソッドの間の境界線が非常に細かくなり得る場合、それは完全に可能です。そして、それは素晴らしいことです。そうすれば、コーディングの問題が邪魔にならず、使用法がより透過的になります。


また、クラスでは、自分が何をしているかを知っているはずであり、まだオーバーヘッドを負担する必要がないため、内部(プライベートまたは保護された)メンバーに直接自由にアクセスできると考えることもできます。別のメソッド呼び出し。

実際には、クラスで作業している複数の人が全員が何をしているのかわからない場合があり、ゲッターとセッターの整合性チェックの行はほとんどの場合に役立つ可能性がありますが、マイクロ最適化はそうではない場合があります。


さらに、変数に直接アクセスする方法は1つしかありませんが、必要な数のアクセサーを定義できます。

于 2010-11-11T16:54:34.977 に答える
1

好みの問題ですが、一般的に言えば、公開されているすべてのプロパティに対して常に get/set メソッドを使用する必要があります。しかし、価値オブジェクト (VO) のようなものについては、おそらくしばらく気にすることはないでしょうが、あまり批判を受けることなくパブリック変数を使用できると思います。

于 2010-11-11T16:45:55.850 に答える
0

クラスのプライベートフィールドをカプセル化し、ゲッター/セッタークラスで希望どおりに公開します。

于 2010-11-11T17:50:20.087 に答える