10

一般的な設計手法では、インスタンス変数をプライベートにし、それらにアクセスするためのパブリック ゲッターとセッターを用意します。しかし、コンストラクター内でセッターを使用する代わりに、プライベート インスタンス変数に直接値を代入するコンストラクターを持つコード サンプルをインターネットで何度も見てきました。何か不足していますか?

public class Person{
    private String name;

    public Person(String name){
        //is this right, seems like the whole encapsulation purpose is defeated
        this.name = name;

        //shouldn't this be used
        setName(name);
    }

    public String getName(){
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }
}
4

10 に答える 10

3

クラスを不変にしたい場合、それはあなたがしなければならないことの 1 つにすぎません。その場合、セッターメソッドはまったくありません。

于 2013-08-03T15:33:02.480 に答える
2

コンテキストによっては、getter と setter の使用は、実際には、コンストラクターでメンバー変数を使用するよりも大きなカプセル化違反です。このクラスのメンバー変数 'name' を設定する場合、構築が呼び出し元から隠され、カプセル化に違反しないため、これらのアプローチのいずれかが機能します。1 つの警告は、コンストラクター内で setName を使用すると、サブクラスでオーバーライドされたメソッドが呼び出される可能性があることです。これは、必要なものではない可能性があります (スーパークラスで名前が未定義のままになる可能性があるため)。

追加の洞察を提供する可能性のある同様の質問を次に示します。

コンストラクターからセッターを呼び出す

于 2013-08-03T15:37:27.997 に答える
1

プライベート変数は、クラス内のどこからでも直接アクセスできます

settng variabels private は、他のクラスからそれらをカプセル化することです

于 2013-08-03T15:35:56.843 に答える
0

これは完全に正常です。一部の変数は、オブジェクトが作成されるとすぐに初期化する必要がある場合があるため、コンストラクターでそれらを渡すことは理にかなっています。多くの場合、オブジェクトの作成後に値が変更されるのを避けるために、これらの変数にセッターを提供したくない場合があります。

于 2013-08-03T15:44:11.887 に答える
0

クラスで提供されたセッターで直接値を代入しても問題ありません。他の処理は行いません。

基本的に、セッター/ゲッターは、プライベート オブジェクトの参照の代わりにデータのコピーを返す、ゲッターでデータを検証するなど、プライベート データへの制限付きアクセスを提供するために使用されます。

コンストラクターはオブジェクト自体の一部であり、実行していることが正しいと確信しているため、問題ありません。

于 2013-08-03T15:59:08.417 に答える
0

変数をプライベートに設定すると、他のクラスからのカプセル化が促進されます。

setName(String)何か特別なことをするつもりでない限り(メソッド名が暗示するものではありません)、プライベート変数があるクラスにいる間はセッターを使用する必要はありません。

于 2013-08-03T15:32:30.403 に答える
0

プライベート メンバーは他のクラスからまだ隠されているため、これによってカプセル化が無効になることはありません。

修飾子メソッドにロジックが含まれておらず、メンバーを設定するだけの場合は、メンバーを直接設定することと、そのセッター メソッドを呼び出すことに違いはありませんが、より良い実践のためには、セッターを呼び出す必要があります。

セッターは、この人物の名前が将来変更される可能性があることを示し、人物オブジェクト全体を再度作成しなくても簡単に変更できるようにします。

于 2013-08-03T15:32:37.193 に答える
0

コンストラクター内で変数を初期化することは、非常に一般的な方法です。これを使用して、ユーザーが呼び出したコンストラクターに基づいて変数に値を割り当てることができます。クライアント コードが setter メソッドを呼び出してインスタンス変数に値を代入するという仮定に基づいてコードを記述することはできません。オブジェクトの作成時 (つまり、コンストラクター内) に変数にデフォルト値を割り当てることは常に安全です。

コンストラクター内で変数を初期化することと、呼び出し元のコードの要件に従って (setter メソッドを使用して) 異なる値に設定することには違いがあります。どちらも異なる目的と異なる目的を持っています。

于 2013-08-03T15:37:29.237 に答える