はじめに
こんにちは(・ω・)ノ
今回はカプセル化について学びました!
第13章 カプセル化
1.カプセル化の目的とメリット
カプセル化とは
他のオブジェクト指向3大機能の「継承」「多態性」の二つはできることを増やし便利にする機能
カプセル化では逆に、できることを制限するために用いる
なぜ制限をするのか...?
例:限られた人しか見れないようにパスワードをかける
↑
情報へのアクセスや動作の実施について「誰に何を許すか」を定めて制限すること
... アクセス制御
つまりカプセル化とは
大切な情報(フィールド)や操作(メソッド)にアクセス制御をかけることにより、
悪意や間違いによるメンバの利用を防止し、
想定しない利用が発生したときに原因を特定しやすくする
2.メンバに対するアクセス制御
4つのアクセス制御レベル
privateやpublicなどは アクセス修飾子 と呼ばれ、
フィールドやメソッドを宣言する際に先頭に記述することでアクセス制御が可能になる
フィールドのアクセス制御
アクセス修飾子 フィールド宣言;
メソッドのアクセス制御
アクセス修飾子 メソッド宣言{...}
privateアクセス修飾
privateであっても、自分のクラスからthis.~での読み書きは可能
メンバに関するアクセス修飾の定石
・フィールドはすべてprivate
・メソッドはすべてpublic
3.getterとsetter
フィールドをすべてprivateにすると外部からいっさい読み書きできなくなる?
→メソッドを経由することでフィールドにアクセスすることができる
ある特定のフィールド値を単に取り出すだけのメソッドの総称... getterメソッド
getterメソッドの定石
public フィールドの型 getフィールド名(){
return this.フィールド名;
}
ある特定のフィールドに指定された値を代入するだけのメソッド... setterメソッド
setterメソッドの定石
public void set フィールド名(フィールドの型 任意の変数名) {
this.フィールド名 = 任意の変数名;
}
privateで外部のアクセスから守ったのに意味がなくなるのでは?
getterとsetterはアクセサとも総称される
アクセサがあることでのメリット
1.ReadOnly,WriteOnlyのフィールドを実現できる
2.フィールドの名前など、クラスの内部設計を自由に変更できる
3.フィールドへのアクセスを検査できる
4.クラスに対するアクセス制御
別パッケージのクラスから見えなくなってしまうpackage privateクラスは
publicクラスでは許可されない2つが許されている
非publicクラスの特徴
1.クラスの名前はソースファイル名と異なってもよい
2.1つのソースファイルにクラスをふくす宣言してもよい
5.カプセル化を支えている考え方
フィールドはメソッドによって守られており、外部から直接アクセスできないようにする
「あるクラスが外部から直接触れないよう、メソッドという殻によてフィールドが保護されている」ように見えることから カプセル化 と呼ばれている
なぜメソッドではなくフィールドを保護しようとするのか?
⇨メソッドよりフィールドのほうが異常な状態になりやすいため
フィールドの値はプログラムが動作する間に刻々と
変化していくため動作中に異常な値になる危険がある
⇨メソッドよりもフィールドを保護することが重要
不具合とは
不具合とは、現実世界と仮想世界が食い違ってしまうことである
「現実世界を忠実に真似る」というオブジェクト指向の本質と直結している、
最も重要な位置付けにある機能の1つ
まとめ
情報へのアクセスや動作の実施について「誰に何を許すか」を定めて制限するアクセス制御のためにカプセル化を使う
カプセル化を使うことで現実世界と仮想世界の食い違いという不具合を起こさないという「現実世界を忠実に真似る」というオブジェクト思考の本質と直結している。
メンバに対してのアクセス制御ではprivateやpublicなどのアクセス修飾子を使う。
メンバに関するアクセス修飾の定石としてフィールドはすべてprivate、メソッドはすべてpublicである
今回もありがとうございました!
ではまた〜 *˙︶˙*)ノ"