TL;DR
-
build.gradle.ktsにkotlin { explicitApi() }と書くことで、可視性を指定していないコードがコンパイルエラーになる- 警告に留めるオプションも存在する
-
Kotlin 1.4から利用可能
Kotlinのデフォルト可視性の不都合な点
Kotlinではデフォルトの可視性がpublicとなっています。
例えば、以下のように定義したFooは、モジュールを問わずどこからでも参照することができます。
class Foo {}
一方、ライブラリやマルチモジュールプロジェクトでAPIを不用意に公開してしまうと、想定外の使われ方をされてしまったり、後から隠すための作業が必要になるなどの不都合が生じます。
また、このような可視性修飾子の有無を一々レビューでチェックしていくことは非現実的です。
Kotlinでは、そのような状況に対応するため、Explicit API modeが用意されています。
Explicit API modeを利用する
Explicit API modeはKotlin 1.4から追加されたコンパイルオプションです。
これを指定することで、コンパイラで以下2つのチェックが行われるようになります。
- 可視性修飾子が設定されているか
- 可視性修飾子が
publicな関数で、戻り値の型が明示されているか
Explicit API modeは、ビルドスクリプトもしくはコンパイラ引数として設定が可能です。
kotlin {
// for strict mode
explicitApi()
// or
explicitApi = ExplicitApiMode.Strict
// for warning mode
explicitApiWarning()
// or
explicitApi = ExplicitApiMode.Warning
}
-Xexplicit-api={strict|warning}
詳細は以下のドキュメントをご覧下さい。
使ってみる
explicitApi = ExplicitApiMode.Strictと指定した上で、少し使ってみた例を示します。
クラスの場合
まず、冒頭で紹介した可視性の指定されていないクラスをコンパイルしてみます。
class Foo {}
すると、以下のようなエラーが発生します。
Foo.kt: (3, 1): Visibility must be specified in explicit API mode
Intellij IDEAでは、IDE上でも以下のようなエラーを確認できます。

関数の場合
関数の場合も試してみます。
fun foo() = "aaa"
この場合、以下のような2つのエラーが発生します。
Foo.kt: (3, 1): Visibility must be specified in explicit API mode
Foo.kt: (3, 5): Return type must be specified in explicit API mode
可視性・戻り値の型ともにエラーになっていることが分かります。
また、IDEA上での表示も同様に機能していました。