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
上での表示も同様に機能していました。