getterとsetterは必ず必要?作るべき場合とgetterのみ・setterのみの使い分けを解説

プログラミング

プログラミングを学び始めると、クラス設計の中でgetterやsetterという仕組みに触れる機会があります。しかし、「変数を用意したら必ずgetterとsetterの両方を作るものなのか」「片方だけ作るケースはあるのか」と疑問に感じる方も多くいます。

getterとsetterは単なる決まりごとではなく、データへのアクセス方法を設計するための仕組みです。この記事では、getterのみ・setterのみ作成する場合や、あえて作らない場合について、具体例を交えながら解説します。

getterとsetterの役割とは

getterとは、クラス内部に保持しているデータを外部から取得するためのメソッドです。一方、setterとは、外部から値を設定・変更するためのメソッドです。

例えば、ユーザー情報を管理するUserクラスがある場合、名前を取得するためのgetName()がgetter、名前を変更するためのsetName()がsetterになります。

class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }

このようにすることで、変数を直接公開せず、クラス内部のデータを安全に管理できます。

getterとsetterは必ず両方作る必要はない

結論から言うと、getterとsetterは必ずセットで作成する必要はありません。必要な機能だけ用意するのが一般的な考え方です。

例えば、外部から値を見る必要はあるものの、変更されたくないデータの場合はgetterだけ作成します。

代表的な例として、ユーザーIDや登録日時などがあります。一度設定した後に変更されると問題になるデータは、setterを用意しないことで変更を防止できます。

getterのみ作成するケース

getterのみの場合は、「読み取り専用」のデータを作りたい場合に利用します。

例えば、商品の価格情報を管理するクラスを考えます。

class Product { private int price; public int getPrice() { return price; } }

この場合、外部から価格を確認することはできますが、自由に変更することはできません。

もしsetterを作ってしまうと、どこからでも価格変更が可能になり、システム上不正な状態になる可能性があります。

このような設計は、オブジェクト指向プログラミングで重要な「カプセル化」の考え方につながります。

setterのみ作成するケース

逆にsetterだけ作成するケースもあります。ただし、getterのみの場合と比べると利用頻度は少なめです。

例えば、外部から設定値を渡す必要があるものの、その値を外部へ公開したくない場合に使用できます。

具体例として、パスワード入力欄のようなデータがあります。パスワードは登録時に設定する必要がありますが、保存している値を取得できるようにする必要はありません。

class Account { private String password; public void setPassword(String password) { this.password = password; } }

このようにsetterだけ用意することで、値の設定は可能にしながら情報の漏えいを防ぐことができます。

getterもsetterも作らない場合もある

すべてのフィールドにgetterやsetterを作成する必要はありません。むしろ、必要以上に公開しないことが良い設計につながります。

例えば、クラス内部だけで利用する計算用の変数や、一時的な状態管理用の変数は外部公開する必要がありません。

初心者の場合、「private変数には必ずgetterとsetterを作る」と覚えてしまいがちですが、本来は「外部からアクセスする必要があるか」を基準に判断します。

setterを作らない設計が増えている理由

近年のオブジェクト指向設計では、むやみにsetterを用意しない考え方も広まっています。

setterが多いクラスでは、どこからでも状態を変更できてしまい、プログラムが複雑になることがあります。

例えば、注文管理クラスで注文状態を自由に変更できるsetterがあると、「未発送の商品を発送済みに変更する」といった不正な状態を作れてしまいます。

そのため、状態変更は専用のメソッドを用意する方法がよく使われます。

order.ship();

このように「発送する」という意味を持ったメソッドを用意すると、内部で必要なチェックを行えるため、安全な設計になります。

言語によってgetter・setterの書き方は異なる

getterとsetterという考え方は多くのプログラミング言語で利用されていますが、書き方は言語によって異なります。

JavaではgetName()やsetName()のようなメソッド形式が一般的ですが、C#ではプロパティという仕組みを利用することもあります。

Pythonでは@propertyデコレーターを使ってgetterやsetterを定義することもあります。

重要なのは書き方を覚えることよりも、「なぜ値を直接公開せず、アクセス方法を制御するのか」という目的を理解することです。

まとめ

getterとsetterは必ず両方作成するものではありません。必要に応じてgetterのみ、setterのみ、またはどちらも作らないという選択ができます。

getterは外部から値を取得させたい場合、setterは外部から値を変更させたい場合に利用します。特に重要なデータについては、setterを作らず変更を制限することで安全なプログラムになります。

プログラミングでは「すべて作る」のではなく、「そのデータを外部からどう扱うべきか」を考えてgetterやsetterを設計することが大切です。

コメント

タイトルとURLをコピーしました