LoginSignup
7
2

More than 1 year has passed since last update.

【Kotlin】Explicit API modeで可視性修飾子を必須にする

Posted at

TL;DR

  • build.gradle.ktskotlin { explicitApi() }と書くことで、可視性を指定していないコードがコンパイルエラーになる
    • 警告に留めるオプションも存在する
  • Kotlin 1.4から利用可能

Kotlinのデフォルト可視性の不都合な点

Kotlinではデフォルトの可視性がpublicとなっています。
例えば、以下のように定義したFooは、モジュールを問わずどこからでも参照することができます。

class Foo {}

一方、ライブラリやマルチモジュールプロジェクトでAPIを不用意に公開してしまうと、想定外の使われ方をされてしまったり、後から隠すための作業が必要になるなどの不都合が生じます。
また、このような可視性修飾子の有無を一々レビューでチェックしていくことは非現実的です。

Kotlinでは、そのような状況に対応するため、Explicit API modeが用意されています。

Explicit API modeを利用する

Explicit API modeKotlin 1.4から追加されたコンパイルオプションです。
これを指定することで、コンパイラで以下2つのチェックが行われるようになります。

  • 可視性修飾子が設定されているか
  • 可視性修飾子がpublicな関数で、戻り値の型が明示されているか

Explicit API modeは、ビルドスクリプトもしくはコンパイラ引数として設定が可能です。

build.gradle.ktsで指定した場合(ドキュメントから引用)
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上でも以下のようなエラーを確認できます。
image.png

関数の場合

関数の場合も試してみます。

可視性・戻り値の型が指定されていない関数
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上での表示も同様に機能していました。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2