ゲッターとセッターは本当に必要?

ほとんどのコードでは、ゲッターとセッターにロジックがないので、公開フィールドを使うのと本質的に変わりません。

現代では、習慣から使っている無駄なもののように思います。

では、なぜまだ使い続けるのか? どう思いますか?

トップコメント (12)


折りたたむ 展開

Javaはバージョン14からレコードがあります。

record Person (String firstName, String lastName) {}

var person = new Person("Joe", "Smith");
log(person.firstName())

ゲッターやセッターはありません。レコードはアクセサ(ゲッターに似ていますが、レコードは不変です)があります。

とはいえ、多くのシリアライゼーションフレームワーク(例えば、POJOをJSON文字列にシリアライズするJacksonなど)はJavaBeansに従った命名規約を求めます。

それに、もちろんカプセル化もありますが、これについてはすでに@andrew さんがコメントで触れていました。

折りたたむ 展開

私がコードで99%の場合見たのは、プライベートフィールドとlombokのゲッターやセッターで、ここでの「カプセル化」の利点を全く見ません。文字通りのカプセル化がありません。

折りたたむ 展開

他の人が取得あるいは設定しない限り、ゲッターとセッターはまったく無意味ですね。ユーザーのコマンドを中断して、取得前、あるいは設定前後にその他のことを行う能力がある時に役立ちます。

折りたたむ 展開

しかし、シリアライゼーションフレームワークはその慣習を必要とします。Hibernate/Jacksonとその他は、値を読みたり設定したりするためにget/is/setで始まるメソッドを探します。

折りたたむ 展開

Hibernateは常にゲッターが必要なわけではありません。
でも、いい指摘です。

折りたたむ 展開

確かに理論的には必要な理由がわかります。
しかし、セッターでそのような検証を行ったことがありますか?
それともそれはドメインクラスの外でいくつかの検証「ビジネス」ロジックでしたか?

「パスワード」のユースケースに関して:
はい、もちろん本当に必要な場所ではセッターを使うべきですが、99%の場合、公開フィールドがあっても問題ありません。

折りたたむ 展開

データを_カプセル化_および/_または_検証する必要がある場合には、ゲッターやセッターを使用します。たとえば、

public int setAge (int newAge) throws IllegalArgumentException {
  if (newAge < 0 || newAge > 150) throw new IllegalArgumentException("invalid age!");
  this.age = newAge;
  return this.age;
}

のように、public int ageフィールドを持つより、年齢を得る場合があります。他にもカプセル化を望む状況があるかもしれませんが、必ずしも検証を提供するわけではありません。例えば

private String myPassword;

public boolean checkPassword (String password) {
 ...
}

public void setPassword (String newPassword, String oldPassword) {
 ...
}

この場合は、新しいパスワードの設定と現在のものとの照合のための方法を提供したいです。公開フィールドがあれば、この機微な情報が漏れる可能性があります。

折りたたむ 展開

これに同意します。機微なデータを守るためにカプセル化がとても重要です。

折りたたむ 展開

はい、理論的には必要な理由が全く理解しています。
しかし、セッターでそのような検証を行ったことがありますか?
それともそれはいくつかの検証「ビジネス」ロジックの外でしたか?

折りたたむ 展開

確かに珍しいですが、ユーザーは通常、オブジェクトと直接対話するのではなく、何らかのUIレイヤーと対話して、そのUIレイヤーがオブジェクトを操作し、その検証は通常そのUIレイヤーで行われると言えます。

これは、ユーザーの入力なしにオブジェクトを作成しようとするとき、たとえばデータベースから直列化されたオブジェクトを読み取りたいときに発生するかもしれません。オブジェクトスキーマが変更された場合は、デシリアライズする前に検証する必要があります。セッターとは異なるかもしれませんが、一般的なアイディアは同じです。

珍しいことですが、必要です。

折りたたむ 展開

私はロジックのないゲッターやセッターは使いません。
また、Javaも使いません。
私はPascalとKotlinを使用します。

折りたたむ 展開

うん、Kotlinはかっこいいよね。

折りたたむ 展開

POJOが最適です。私は常にゲッターやセッターを時間の無駄だと思っていました。使うなら論理をわかりにくくします。変更するにはユーティリティ関数を使うべきです。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/andsmile/do-we-really-need-getters-setters-200j