カプセル化
オブジェクトのデータ、振る舞い(メソッド)を隠蔽すること
フィールドのカプセル化: 内部のフィールドを private にして、外部からはアクセサ(setter/getter)を通じてアクセス
なぜ必要?
直接アクセスをしていると、アクセス先のオブジェクトの内部表現が変更されたときに被害が大きい
たとえばこんな例があるとして
code:Example(java)
class Hoge {
String name;
int age;
...
}
class Fuga {
...
Hoge hoge = new Hoge();
...
System.out.println(hoge.name); // <- 直接アクセス
hoge.age++; // <- 直接アクセス
}
Hogeクラスが次のように使用変更される場合を考える
code:Example(java)
class Hoge {
Person person;
...
}
class Person {
String name;
int age;
...
}
こうなると、直接アクセスしていた場合はHogeを参照しているすべての部分を探し出して変更しなければならない
アクセサを使う場合は
code:Example(java)
class Hoge {
private String name;
private int age;
...
public void setName(String arg) {
name = arg;
}
public String getName() {
return name;
}
...
}
class Fuga {
...
Hoge hoge = new Hoge();
...
System.out.println(hoge.getName()); // <- アクセサ使用
hoge.setAge(hoge.getAge()+1); // <- アクセサ使用
}
同様にHogeに変更があった場合でも
code:Example(java)
class Hoge {
private Person person;
...
public void setName(String arg) {
person.setName(arg);
}
public String getName() {
return person.getName();
}
...
}
class Fuga {
...
Hoge hoge = new Hoge();
...
System.out.println(hoge.getName()); // <- 変更の必要なし
hoge.setAge(hoge.getAge()+1); // <- 変更の必要なし
}
というように、Hogeを変更するだけですむ
setter で値を set する際に異常値チェックを行うことができる