デフォルトのVisibilityがpublic!
Androidで開発を行っている人のうちベテランという人たちはほとんどJavaで開発を行ってきて、後からKotlinを憶えたと思う。
業務で開発を行っている人はクラスや変数などにVisibility修飾子(public, privateなど)を付けないと言うことはないだろう。何をどれだけどの相手に見せるかを意識するのが普通だからだ。
だからこそ気がつきにくいのだが、Kotlinの場合、Visibility修飾子を何も付けないデフォルトがpublicでpackage privateのJavaとは異なる。
そもそもKotlinにはPackageというものをつかってVisibilityをコントロールする機構がない。Kotlinの場合のPackageはただソースコードをまとめているだけの存在なのだ。
internal 修飾子
package privateというものがない代わりにinternalというものがある。これはmodule内でのみ見えるというものである。moduleとは一緒にコンパイルされるソースコード群をまとめたもの。JavaのPackageに近いものだ。
まとめ
Kotlinの場合、既定のVisibility修飾子がpublicである事を肝に銘じておく。何も付けない関数などを作らないのが一番だ。
外側がpublicより厳しいVisibilityの場合、内部にpublicになるインナークラスや関数を設けるとコンパイルエラーになるはずだ。しかし公開用のpublicクラスの中で知らず知らずに一部の関数をpublicにしてしまうことはできる。
かつてのJavaScriptでグローバル変数を知らず知らずにモディファイしてしまうバグが皆を悩ませたが、それと同じ事が起きかねない。