エンティティオブジェクトのデータプロパティのゲッターとセッター
-
03-07-2019 - |
質問
最近、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; }
}