美人すぎない化粧品販売員がアプリ開発を目指す

Javaの構文、オブジェクト指向、APIなど、プログラミング初心者の私がアプリ開発までに理解したことをまとめたブログ

クラス/メンバに対するアクセス制御

☆ クラスに対するアクセス制御

 

(名前)       (記述)        (許可)

package private                 なし      自分と同じパッケージに属するクラス

public                                public                    全てのクラス

 

ex.         class HeroSkill{  ←記述なしなので、package private

                 public void use( ){....

                }

          }    

・・・メソッドはpublicでも、パッケージがpackage privateだと

                           他のクラスのパッケージからメソッドへはアクセス出来ない

      「一番外側のブロックのアクセス修飾子で判断する」

 

 

 〈publicクラスの原則〉

 

 「1つのファイルにpublicクラスは1つだけ」

 「publicなクラスの名前はファイル名と同じにする ファイル名=public クラス名」

 

 〈publicがついていないクラス〉

 

      「ファイルの中にいくつあってもOK」

  「クラス名はファイル名と同じでなくて良い」

 

ex. パッケージ名 Hero.java

              public class Hero{....}

                          class HeroSkill{.....}

                          class HeroSimble{.....}

 

☆ メンバのアクセス制御

 特別な理由がない限り

フィールドはprivateにして、外部のクラスからはアクセスできないようにして、

  外部からアクセスしたい時はsetter/getterメソッド経由でアクセスする

 

外部から直接触れないようにフィールドを保護するため、「カプセル化」と呼ぶ

 

 

なぜメソッドではなく、フィールドを保護するのか?

 メソッドよりフィールドの方が異常な状態(不具合)になりやすいから

 

メソッド→1度コンパイル(型チェック)されてしまえば、実行中に変化することはない

フィールド→プログラムが動作する間に逐次更新されていく

       ex.hp 10→5→100

      何度も更新されるということは、その分こちらの手違いで予測していなかった値を入れてしまう可能性が高くなるという事・・・それなら保護した方が安全!

 

☆ 不具合(バグ)とは何か?

そもそもオブジェクト指向の目的

「現実世界の動きをそっくりそのままJVMの仮想世界で再現するということ」

 ・・・ということは不具合とは

「現実世界の動きと仮想世界の動きが食い違ってしまうこと」

 

カプセル化を使えば

アクセス制御されているところにはアクセス出来ないので、

現実世界の動きと食い違ってしまう可能性(フィールドに異常な値が入る可能性)はなくなる

→仮想世界に現実世界と矛盾のないプログラムが作れる

 

よってカプセル化とは、

「現実世界を真似る」というオブジェクトの本質と直結している

                         重要な位置づけにある機能