Java

【Java】オブジェクト指向のカプセル化をしっかり解説

オブジェクト指向を理解する際に必ず出てくるのがカプセル化です。

カプセル化を一言でいうなら、データを隠蔽する仕組みです。

しかし、そう言われてもピンとはこないはずです。

なので、実際のプログラム例を見て学んでいきましょう。

カプセル化の例

(Main.java)

これがカプセル化です。

ご覧の通り、「Cloud」クラスで宣言されている「x・y」変数と「name」変数は「private」で宣言されているため、外部からのアクセスができないようになっています。

つまり変数の隠蔽です。

しかし、このままでは「x・y」変数や「name」変数の操作や値の取得はどうするのでしょうか。

次の例を見てみましょう。さきほどのプログラムのつづきです。

ゲッターとセッター(Getter/Setter)

(Main.java)

最初に言ってしまうと、このゲッター・セッターには、とある問題が潜んでいます。

まず、このゲッターとセッターですが、その名の通り変数の値をゲット(取得)する関数と、セット(操作)する関数のことになります。

こうすることで、「private」で宣言された変数の値を取得・操作することが可能になります。

気づきにくい、ゲッター・セッターの罠

しかしゲッター・セッターには気づきにくい罠がありました

多くのプログラマはゲッター・セッターを使っていることでしょう。

「private」で変数を隠蔽し、ゲッターとセッターを用意する。

最近の開発環境でも、ゲッターとセッターを自動で生成する機能が存在します。

しかし、実はこのゲッターとセッターは完全なカプセル化を実現する上ではあまり必要ではないのです。

次の例を見てみましょう。これも先ほどのプログラムのつづきになります。

(Main.java)

この「Move」クラスをみてください。

これは雲を移動させるためのクラスとして用意したのですが、「update」関数で「setName」関数を呼び出して勝手に「入道雲」という名前に設定してしまっています

1人で開発するのであればこんなことはほぼありえないのですが、大人数で開発する場合は、起こりうる話です。

なので、本来ならカプセル化をして、このような関係のない処理はさせないようにするべきなのです。

現状のゲッター・セッターを用いたカプセル化では、完全にカプセル化を実現することはできていないのです。

つまり、「private」で宣言して、ゲッター・セッターを用意してカプセル化完了!というふうに思考停止すると、落とし穴に落ちる可能性があるのです。

ではこの場合、どうするのが正解なのでしょうか。

それが次の例になります。

(Main.java)

「Cloud」クラスの「X・Y」座標を管理する変数を「Property」型の「xProperty・yProperty」にし、「Move」クラスにある「xProperty・yProperty」に紐づけます

そうすることで、「Move」クラスが操作できる変数を「X・Y」座標の2つだけに限定することに成功しました。

まとめ

オブジェクト指向のカプセル化で重要なのは、操作させていい変数をオブジェクトそのものが決めてしまうということです。

従来のゲッター・セッタープログラムだと、外部のクラスがいろんな変数を自由に取得・変更できてしまいます。

これではオブジェクトはただのデータフォルダにすぎません。

そうではなく、オブジェクトには意思があり、データの管理を自分で行うことができるのです。

これがオブジェクト指向の根本であり、真のカプセル化のあるべき姿なのです。


【筆者オススメ!】
↓Javaをさらに勉強したい方へ(スポンサーリンク)





ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です