Kotlinでは、visibility modifiersを使用して、クラス、プロパティ、関数、およびトップレベル(ファイルレベル)のエンティティへのアクセスを制御します。Javaとは異なり、Javaでは修飾子がクラスレベルでのみ機能しますが、Kotlinではトップレベルの宣言にも適用され、これは大規模プロジェクトやライブラリAPIの構成において重要です。
Javaにはクラス外の関数やプロパティのためのvisibility modifiersがなく、すべてがpublic(またはpackage-private)クラスの内部に存在します。Kotlinでは、プロジェクトを独自に構成することが一般的で、関数やプロパティがクラス内ではなく、ファイル内に直接存在することがよくあります。
Javaの開発者はしばしば、publicがJavaと同じように機能することを期待しますが、Kotlinではトップレベルの関数(またはプロパティ)は明示的に別の修飾子でマークされていない限り、すべてのモジュールから見えることになります。visibilityを正しく定義しないと、公開APIが汚染され、内部ユーティリティが予期せず入手可能になったり、必要な公開関数が利用できなくなったりします。
Kotlinでは、次のvisibility modifiersが利用可能です:
例:
// file: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // publicは省略可能 fun printValue() { println(bar) }
トップレベル関数にprotectedを使用できますか?
いいえ、protectedはクラス/インターフェースのメンバーにのみ関連し、トップレベル要素はサポートされていません。
トップレベル関数をinternalとして宣言した場合、他のモジュール内で見えるでしょうか?
いいえ。現在のJAR/Gradleモジュールの範囲内でのみ見えます。
privateクラスとprivateトップレベル関数の違いは何ですか?
例:
// file: Utils.kt private fun helper() { /* ... */ } // このファイル内でのみ見える internal fun useful() { /* ... */ } // モジュール全体で見える
テストユーティリティがpublicとして宣言され、アーティファクトに含まれるため、ライブラリのクライアントに混乱をもたらします — public APIに関連しないすべてが見えるようになります。
利点:
欠点:
内部関数がprivateとして宣言され、内部で一般的に使用されるユーティリティがinternalの可視性を持ち、慎重に考慮されたインターフェースのみがpublicとして提供されます。
利点:
欠点: