4

それで、「セッター」と「ゲッター」のメソッドと、それらがどれほど役立つか、またはそうでないかについて質問があります。

次のような非常に基本的なプログラムを書いたとしましょう。

    public class Account
    {
     String name;
     String address;
     double balance; 
    }

次に、次のように、この「アカウント」クラスを使用する別のクラスを作成するとします。

    class UseAccount
    {
        public static void main(String[] args)
        {
            Account myAccount = new Account();
            Account yourAccount = new Account();

            myAccount.name = "Blah blah"
        }        
    }

などなど

私が書いているときmyAccount.name = "Blah blah"は、「Account」クラスの変数「name」の値を変更しています。このように記述されたコードを使用して、何度でも自由にこれを行うことができます。しかし、「Account」クラスの変数を非公開にしてから、「setter」および「getter」メソッドを使用する方がよいことに気付きました。したがって、次のように書くと:

    public class Account
    {
       private String name;
       private String address;
       private String balance;

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

       public String getName()
       {
          return name;
       }
    }

次のような別のクラスを作成するだけで、変数「name」の値を変更できます。

    class UseAccount
    {
       public static void main(String[] args)
       {
          Account myAccount = new Account();

          myAccount.setName("Blah blah");
       }
    }

このメソッドの使用がどのように異なるのか、または人々がプライベートフィールドの値を変更するのを防ぐことになっているのかわかりません。何か助けはありますか?

4

8 に答える 8

7

単純なアクセサー メソッドでは、スタイル以外に違いはありませんが、それらを使用してコードを実行することもできます。次に例を示します。

public void setName(String name) {
    if (name == null) {
        throw new IllegalArgumentException("Name may not be null");
    }
    this.name = name;
}

getter からコピーを返すこともできるため、データを保護できます。

private List<String> middleNames;
public List<String> getMiddleNames() {
    return new ArrayList<String>(middleNames); // return a copy
    // The caller can modify the returned list without affecting your data
}

これらは 2 つの簡単な例にすぎませんが、アクセサー メソッドの使用例は無限にあります。

一貫したスタイルに従う方がよいため、常にゲッター/セッターを使用します。必要に応じて、このようなコードを実行できます。

于 2012-07-16T04:59:25.550 に答える
6

このオブジェクト指向プログラミングの黄金律を試してみてください。

1.プライベートインスタンス変数を作成します。

2.これらのインスタンス変数にアクセスするパブリックゲッターとセッターを作成します。

3.この方法論はカプセル化と呼ばれます。カプセル化は別の方法で使用できますが、それはデザインパターンで重要ですが、変化し続けるこれらの動作のように、抽象クラスまたはインターフェイスにカプセル化する必要があります。

4.さて、ゲッターとセッターの話題に戻ります....

ゲッターとセッターは、インスタンス変数への入力の検証に役立ちます。

例: 犬の年齢を割り当てるメソッドを取得したと仮定します。年齢を負にすることはできません。setter メソッドがない場合、年齢の入力を検証することはできません。

private int age;

public void setDogAge(int age){ 
    if (age>0){
        this.age = age;
    } 
    else{
        System.out.println("Please Enter a Valid Age");
    }
}
于 2012-07-16T06:09:40.700 に答える
2

セッターとゲッターを使用する利点は、遅延初期化、検証などのルールを含めることができることです。また、Java Beans 準拠コードを実装する必要がある場合は、それらのルールに従う必要があります。

Java Bean 仕様

于 2012-07-16T05:02:10.860 に答える
1

コードが変更されない場合は、その通りです。違いはありません。

ただし、コードは大幅に変更されます。誰が自分の名前を変更したかを追跡する必要がある場合はどうなりますか?

名前フィールドが変更されるたびに true に変更されるアカウント クラスにブール値が必要です。

したがって、すべてのソースファイルを調べて、

myAccount.nameChanged = true'それぞれの下に

myAccount.name = whatever;

そのため、コードの重複が始まり、バグの可能性が高まります。名義変更を忘れた場合はどうなりますか?

これに対抗する最善の方法は、メンバー変数を として分類することprivateです。

setName コードは次のようになります。

public void setName(String newName)
{
    name = newName;
    nameChanged = true;
}

そして、バグを心配する必要はありません!

于 2012-07-16T05:02:40.330 に答える
1

これはEncapsulation、いくつかのプライベート インスタンス変数を宣言し、インスタンス変数の値にアクセスして変更することを宣言しているときにpublic getter呼び出さsetter methodれます。

これらの getter および setter メソッドを使用してインスタンス変数にアクセス/設定している場合、開発者がインスタンス変数名を変更してもプログラムが失敗しないことが保証されます。

たとえば、現在のバージョンでは、名前、アドレス、バランスのインスタンス変数を使用しており、getter および setter メソッドを使用せずにそれらにアクセスしています myAccount.setName("Blah blah");が、次のバージョンの開発者がインスタンス変数名を からnameに変更するuserNameと、ユーザー プログラムは壊れますが、getter を使用している場合開発者がゲッターとセッターのメソッド名を変更しないため(OOPSの基本に従って)、セッターは壊れません。

于 2012-07-16T05:05:40.563 に答える
0

実際のところ、getter/setter メソッドのアクセス修飾子を変更するか、それらに追加のロジックを追加するまで、それは妨げられず、違いはありません。後者は常に良いアイデアとは限りませんが、役立つ場合があります。たとえば、名前を更新すると、キャッシュされた値が更新されたり、結果としていくつかのチェックが実行されたりします。ゲッター/セッターを使用することは良い習慣であり、POJO や JavaBeans などのいくつかのアプローチで使用されますが、ゲッター/セッターにカスタム ロジックを追加せず、これらのアプローチを使用しない場合は、フィールドへの直接アクセスを使用することで十分です。 .

一つ言いたいことがあります。ゲッター/セッターを使用すると、オブジェクトに永続的に存在しない実行時計算フィールドを提供できます。たとえば、Accountクラスのオブジェクトは生年月日を保持しており、その年齢を取得する必要があります。

于 2012-07-16T05:02:04.260 に答える
0

getter メソッドと setter メソッドを使用せずにいつでもアプリケーションを開発できます。カプセル化、抽象化、継承などの OOPS 機能を使用しなくても、いつでもプログラムを作成できます。

于 2012-07-16T05:02:48.223 に答える
0

Account クラスの各フィールド宣言の前にある Java キーワード「private」は、そのフィールドへの直接参照を防ぎます。UseAccount クラスに myAccount.name = “whatever” を入れると、「name has private access in Account」というエラー メッセージが表示されます。myAccount.name を参照する代わりに、UseAccount プログラマーはメソッド myAccount.setName またはメソッド myAccount.getName を呼び出す必要があります。これらのメソッドは、Account クラスのフィールドへのアクセスを提供するため、アクセサー メソッドと呼ばれます。

于 2014-05-22T21:46:04.877 に答える