クラス/メンバに対するアクセス制御
☆ クラスに対するアクセス制御
(名前) (記述) (許可)
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の仮想世界で再現するということ」
・・・ということは不具合とは
「現実世界の動きと仮想世界の動きが食い違ってしまうこと」
カプセル化を使えば
アクセス制御されているところにはアクセス出来ないので、
現実世界の動きと食い違ってしまう可能性(フィールドに異常な値が入る可能性)はなくなる
→仮想世界に現実世界と矛盾のないプログラムが作れる
よってカプセル化とは、
「現実世界を真似る」というオブジェクトの本質と直結している
重要な位置づけにある機能