2022-03-18
カプセル化はオブジェクト指向でも最重要項目の一つです。
名前の通りデータを内包するという意味合いを持っています。
以下が主な役割だと思っています。
■変なデータ・クラスの内容と関係ないデータが入らないようにデータを保護する。
■データの整合性を高める
■メソッドの役割をスーパークラスに任せておくことで独立性を高められる
javaにおいて欠かせない概念ではありますが、まずフィールド(変数)のみを書いた
クラスで試してみます。
//スーパークラスでのやりとり public class Profile{ int num; // 省略 } //サブクラスでのやりとり Profile prof = new Profile(); prof.num = 200;
インスタンス生成後にフィールドのデータに200を追加しています。
制限が何もないので値を入れ放題の状態です。
このままでは好き放題数字を変えられてしまいますね。何のアプリにしろこれではまずいですよね。
そこで、このような事故を防ぐために外のクラスからアクセスさせないようにする必要があります。
変えられたら困るデータは、中にメソッドの内容を書くことで
予期せぬ変更を防ぐことができます。
public class Profile { //privateを設定することで他のクラスからアクセスできなくする private int num; public long getNum () { return num; } public void addNum (int org) { // 預け入れ額の加算 num += org; } } public class Main { public static void main(String[] args) { Profile prof = new Profile(); prof.addNum(20); } }
スーパークラスのaddNumというメソッドがありますが、これは引数の
値をフィールドのデータに追加していく処理を持っています。
このメソッドを介した値のみ変更の対象となるので、突発的に的はずれなデータが
送られて関連性のないデータに変更されるということがなくなります。
カプセル化にはgetter/setterの概念がありますが、下は間違った作り方です。
public int getNum(){ return this.num; } public void setNum(int n){ this.num = n; }
setNumがただ置き換えただけになっています。この状態ではnumを上書きしてしまうので、乗除算系の
処理を書く時はフィールドの値がそのメソッドの処理の影響をどう受けるかを
考えて書く必要があります。
以上が自分がカプセル化をいじって学んだ上での所感になります。
javaの知識がまだまだ浅いので説明が若干拙く感じる・・・。