質問: Androidアプリで使用するライブラリを初めて自作しており、可視性を含めたパッケージ分けに悩んでいます。 ネットを探してみてもそのあたりの定石がよくわかりません。 以下のようにパッケージを切っているのですが(説明のために多少省略しています)、 **どうにかして `Util.java` 以外を見えないようにしたいです。** (ライブラリ使用側に `Util.java' 以外を見せたくありません) パッケージ分けをなくしてフラットな構成にすればいいのはわかっているのですが、 わかりやすくパッケージ分けをしながらうまく可視性の調整ができる方法があるのかと思い質問するに至りました。 * `model`, `usecase`, `repository` パッケージの各クラスは (省略しています)**public**になっている * `Util` から `usecase`, `model`パッケージへの参照、 `usecase`パッケージから `repository`, `model`パッケージへの参照があります。 com.hogehoge |--> model |--> usecase |--> repository |- Util.java
回答: 使用すべきAPIではないことを強調したい、中身を簡単に知られたくないという観点であればproguardなどで難読化するのが一般的かなと思います。 例えば上記の例であれば、proguardをかけると com.hogehoge |--> a |--> b |--> c |- Util.java のように意味のない文字列に変換することができます(各パッケージ内のクラス名などもaやbのようになります)。 そのため、クラス名やメソッド名からは判断がしにくいですし、ドキュメントも公開しないことで基本はアクセスされることはないかなと思います。 呼び出しが一切できないようにしたいということであればビルド時に自動的に同じパッケージ、パッケージプライベートなクラスに書き換えるプログラムを差し込むとかになっちゃいますかね。。。 それでも最悪リフレクション使えばアクセスできてしまいますが。 kotlinであればモジュールという概念があり、同一モジュール内であれば別パッケージでもアクセス可能かつモジュールの外からはアクセスできないということが可能だったと思います。