Javaにおけるgetter/setterは必要性とは?オブジェクト指向プログラミング言語の動向

getter/setter “は、Javaプログラマであればお馴染みのメソッドです。しかし、この存在意義について疑問を感じる方も少なくないようです。

そこで今回は、Javaにおけるgetter/setterの必要性、近年のオブジェクト指向プログラミング言語の傾向についてお伝えしていきます。

Javaにおけるgetter/setterの必要性

Javaを使うプログラマーであれば、一度は考えたことがあるのではないでしょうか。

getterとかsetterっているの?

多くのオブジェクト指向プログラミング言語入門書には「フィールドをprivateにし、値の書き換え・読み取りに関してはgetter/setterを使う」といった解説がなされています。これは入門書という性質のため、基本として抑えておかなくてはならないポイントだからだと考えられるでしょう。

しかし実際のプログラマからは、「getter/setterはいらない」という意見が出ているのも事実です。要不要についてはそれぞれのキャリアや立場があるため、どちらが正解とは一概に言えません。参考までに、不要派、必要派それぞれの意見を一部紹介します。

■要不要、それぞれの意見

■不要派

・全てのフィールドにgetter/setterを定義するとことにより、コードが冗長・煩雑化してしまい、メソッドの管理が面倒になる

・フィールドにアクセスするだけなら不要なケースが多い。ただし、処理に必要なラベルが付いている時は意義がある場合もある

・Java自体がそもそも不完全な言語。クラス属性がフィールドかgetter/setterかソースコード上で表面に出てしまうのが問題

■必要派

・基本的にJavaBeansの仕様に従うべき

・妥当性のチェックとしてsetterは必要。レビュアーの立場だと、getter/setterかフィールドかを判断することで、バグ要因を見つけやすい

・多くの情報を扱うクラスの場合、フィールドをprivateにすることで他のクラスからアクセスできなくなるため、操作されてしまうリスクを回避できる

・条件に合わせてsetter/getterを設けると、どのフィールドに対して付けられているかを考えるのが煩雑になるので、すべて統一しておいたほうがよい

上記を見ていくと、とくにJavaという言語においてgetter/setterは意義がある、と考えられます。しかし、不要派が訴えるように、実際のプログラミングにおいては使用に違和感が残るなどのデメリットもあるのが実情のようです。とは言え、フィールドをprivateにし、メソッド経由の操作を行う原則に変わりはありません。

■最終的にはどうすべき?

ポイントは“カプセル化”にあると言われています。カプセル化が目指すのは、変更によって出る影響の範囲をできるだけ狭めること。getter/setterで呼び出しを行う場合は、呼び出される側の責務の割り当てへと、置換できないかを検討し、可能であればそれを選択するのが一般的です。

そのため、単に全てのフィールドにgetter/setter を定義付けるべきか、使用を禁止すべきか、というのではなく、状況に合わせて適切なコードを書けることがJavaを扱うプログラマには求められると言えるでしょう。

次のページ:
ブジェクト指向プログラミング言語の傾向について

 

関連する記事

facebook

案件情報や最新記事をお届けします。
ぜひチェックしてみてください。