前回までの実装について以下にクラス図を示します。
ここから以下のようにデフォルトパッケージを作成します。
右クリックから「新規」>「パッケージ」をクリックして下さい。
「com.sample」というパッケージを作成しました。
ドラッグ&ドロップで作成した「com.sample」に移動しました。
「TestClass」のアクセス修飾子「public」を削除します。これでデフォルトアクセス修飾子になります。デフォルトアクセス修飾子は修飾子はパッケージ外からアクセスできません。
HelloWorldクラスでは「com.sample.TestClass」が不可視ですというエラーが発生してしまうので、import文を削除します。
Factoryというクラスを作成します。
Sample型を返却するcreateメソッドを作成します。TestClassをインスタンス化して返却します。
mainメソッドで、先程作ったFactoryクラスのcreateメソッドを呼び出します。
現状、TestClassはデフォルト修飾子となっているため、外部のパッケージからはアクセスできませんが、同じパッケージからはアクセスできてしまいます。
パッケージ内部でアクセス制御する場合はInnerクラスを使用します。
クラスの中にクラスを定義することをInnerクラスと呼びます。
Factoryクラスの中に「InnerSample」というInnerクラスを作成します。アクセス修飾子をprivateにすることでクラス外からはアクセスできない状態にします。
Factoryクラス内部ではこの「InnerSample」というクラスを扱えます。
そこでcreateメソッドにて、「new Factory().new InnerSample();」を返却するようにします。
これで同パッケージからも隠蔽することが出来ました。
隠蔽を意識せずにアクセスができてしまうクラスを作成すると、色々な箇所(クラス)から使用されてしまい、クラス設計が煩雑になってしまいます。そうすると、バグの温床になったり、修正が困難になってしまいます。
コメント