2

私はJavaが初めてです...私の質問は

クラス外のデータ メンバーにアクセスしないために、アクセス修飾子を使用します。また、セッター メソッドを使用してクラス外でデータ メンバーを変更する理由。元:-

public class Test
{

       private int a=10;
       private int b=20;
       public void sum(int x, int y)
       {
           System.out.println("Sum is:"+(x+y));
       }
       public void setA(int a)
       {
           this.a=a;
       }
       public void setB(int b)
       {
           this.b=b;
       } 
}

これらのタイプのケースのように、setter メソッドを使用して変更する代わりに、 public members を使用しないのはなぜですか? そして、どのタイプの状況でセッターを使用する必要がありますか...?

私にはそれが理解できません..誰か助けてください.

ありがとう

4

6 に答える 6

4

カプセル化といいます。Mutator メソッドは、フィールドが予期された制御された方法で変更されることを保証します。

于 2013-02-12T13:41:35.180 に答える
3

要件が変わる可能性があるためです。

public void setA(int a)
{
    if (a >= 0) {
        this.a=a;
    }
}

public メンバーを使用したばかりの場合は、値aが設定されているすべての場所でコードを変更する必要があります。セッター メソッドを使用する場合、コードを変更する必要があるのは 1 か所だけです。

于 2013-02-12T13:42:27.087 に答える
0

古典的な生物学の実験では、サルのグループがバナナをつかむように誘惑され、その結果、全員が冷たいシャワーを浴びることになります。彼らはすぐにやめます。徐々にサルは新参者に取って代わられ、各新人はバナナに触れないようにする難しい方法を学びます。すぐに元のメンバーは残りません。冷たいシャワーを実際に目撃した人は誰もおらず、実際、メカニズムは長い間オフになっています。しかし、新人はまだバナナを食べようとして殴られます.

私たちの話では、バナナは公共の場であり、サルはあなたの周りにいます。public フィールドを無批判に避けることは、ベスト プラクティスではありません。それは宗教的な慣習です。それを支持する「議論」の標準的な弾幕がありますが、それらのどれも普遍的に成り立ちません. いくつか例を挙げると:

  1. 要件は変更される可能性があります」 - 純粋なデータ オブジェクトのセッターの要件は変更されません。これは、安定した API の最も純粋な例の 1 つです。ビジネス ロジックの設定では、ドメイン モデルのゲッター/セッターは、純粋な取得/設定以上のことを行ってはなりません。これらは、テストを含むさまざまなコンテキストで使用され、驚くようなことがあってはなりません。設定値の保持以外のすべての問題は、getter/setter コードの外部で処理されます。

  2. 内部表現は変更される可能性がありますint」 — anを anintに、 aStringを aに、というように保存する最良の方法Stringです。これが真実ではない現実の状況は決して起こりません。

  3. "パブリック フィールドはカプセル化を破る、OOP のポスト" — パブリック ゲッターとセッターでは効果的なカプセル化はありません。

  4. "パブリック フィールドは、フレームワーク コードによるインスツルメンテーション/アドバイスを防ぎます" — Hibernate を見てみましょう: ゲッター/セッターと対等な立場でパブリック フィールドを許可します。これは、最新の Java で解決された問題です。

問題のクラスがローカルでのみ使用され、パブリック API として公開されていない場合は、直接フィールド アクセスを使用できます。また、クラスが純粋なデータを表す場合、多くの場合、パブリック API でもパブリック フィールドを使用しても問題ありません。たとえばGridBagConstraints、Java 標準ライブラリの を参照してください。

于 2013-02-12T14:17:38.030 に答える
0

クラスの属性(あなたの場合は a と b )は、オブジェクトの状態を表します。したがって、OOP では、状態をプライベートにして、パブリック メソッドを介してのみアクセスすることをお勧めします。

パブリック セッター/ゲッターがある場合にのみ、プライベート属性にアクセスできます。したがって、これにより柔軟性が得られるだけでなく、アクセスを制限するオプションも提供されます(必要な場合)。

于 2013-02-12T14:43:52.107 に答える
0

カプセル化の利点:

  1. クラスのフィールドは、読み取り専用または書き込み専用にすることができます。
  2. クラスは、フィールドに格納される内容を完全に制御できます。
  3. クラスのユーザーは、クラスがそのデータを格納する方法を知りません。クラスはフィールドのデータ型を変更でき、クラスのユーザーはコードを変更する必要はありません。

簡単な使用例:

最小限に抑えたいa:

private int a;

public void setA(int a) {
    if(this.a > a)
         this.a = a;
}

次に、気が変わって最大値を維持したいと考えましたa

public void setA(int a) {
    if(this.a < a)
         this.a = a;
}

メソッドを使用していない場合はsetA()、新しい値を に設定しようとした各場所を更新する必要がありましたa。ただし、 を使用したことがある場合はsetA()、メソッド以外の場所に触れる必要はありませんsetter

同様の質問を見てください:

Javaでのゲッター/セッターの用途は何ですか?

于 2013-02-12T13:43:17.447 に答える
0

OOP によると、常にプライベート属性を使用して情報をカプセル化し、変数の不適切な操作が原因で別のプログラマーまたはオブジェクトがメソッド機能に影響を与えないようにする必要があります。次に例を示します。

   private int a=10;
   private int b=20;
     public void div()
          {
                  System.out.println("Div is:"+(a/b));
           }
      public void setA(int a)
             {
                         this.a=a;
            }
     public void setB(int b)
           {
                  if(b!=0)
                    this.b=b;
           } 

たとえば、この場合、セッターは、0 が属性として保存されないことを検証します (エラーまたは何かをスローする必要があります)。これが発生すると、divメソッドが破損するためです。

基本的に、属性のデータを保護する必要がある場合、または属性に保存された値がオブジェクト内の機能/メソッドに影響を与えないようにしたい場合は、セッターを使用します。

pd: 私の英語でごめんなさい。

于 2013-02-12T13:44:46.980 に答える