エンティティオブジェクトのデータプロパティのゲッターとセッター

StackOverflow https://stackoverflow.com/questions/406288

質問

最近、Javaでの作業を開始し、すべてのゲッターとセッターのワイルドでクレイジーな世界に触れました。最初は嫌いでしたが、すぐに慣れました。慣れすぎています。

私は最近、クラスの設計についてより多くの時間を費やしてきました。私がやろうとしていることの1つは、すべてに対してゲッターとセッターを行うというtrapを避けることです。ただし、私が行う作業の多くは、主にデータコンテナーであるエンティティに関するものであり、これらの場合にゲッターとセッターが実際に不適切であるかどうかはわかりません。

これは、パブリックプロパティを使用した簡単な例です。

class Space {
    public String name;
    public String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
}

プライベートプロパティを使用し、ゲッターとセッターを使用する簡単な例を次に示します。

class Space {
    private String name;
    private String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getDescription() {
        return this.description;
    }
    public void setDescription(final String description) {
        this.description = description;
    }
}

これらの例では、 name description の両方のフィールドを変更できる必要があります。

ゲッター/セッターの例はより明確で、 name description の実装の詳細を隠しているように感じます。必要に応じて、後でセットの検証も可能になります。

ゲッターとセッターが悪であるかアンチパターンであるという議論をいくつか読んだことがありますが、この状況には当てはまらないかもしれません。

おそらくまだ検討していないオプションがいくつかあります。提案をお待ちしています!

役に立ちましたか?

解決

簡単にするために:

  • 外部から読み取る必要があるすべてのフィールドにゲッターが必要です。
  • 外部から書き込む必要のあるすべてのフィールドにセッターが必要です。

これは100%になる可能性がありますが、ほとんどの場合は小さくなります。

他のヒント

最初のバージョン(パブリックプロパティ)はお勧めできません。 2番目の方が優れています。 Josh Blochが言うように、" favor immutability"

public class Space {
    private final String name;
    private final String description;

    public Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

そうは言っても、ゲッターとセッターは使いすぎる

あなたは、しばしば「単純化された「get / setterは悪」だ」と聞きました。誰も(希望しません)本当には、データオブジェクトに何か問題があることを意味します。本当のアイデアは次のとおりだと思います:

"ゲッター/セッターは、プレーンなデータストレージオブジェクトを除き、悪です"それ自体は「聞かないで」と伝道するだけです。

理想的には、クラスにゲッターとセッターがある場合、それは all でなければなりません。

それはとにかく議論です。同意するかどうかわかりません。

アクセッサパターンはクラスの実装の詳細を隠すのに役立ちますが(たとえば、ハッシュテーブルを使用して属性を保存し、まばらに使用されるクラスのメモリを節約します)、実装が非常に冗長になる可能性があります(アクセサにはさらに12行あります)。そのため、C#にはデフォルトのアクセサーを簡潔に指定できる特別なプロパティ構文があります。

class Space {
    public String Name { get; set; }
    public String Description { get; set; }
    Space(final String name, final String description) {
        this.Name = name;
        this.Description = description;
    }
}

代替フォームでは、アクセス指定子やコードを追加できます:

private String _name;
public String Name {
    get { if (_name == null) FetchName(); return _name; }
    private set { _name = value; }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top