問題の背景:
可視性修飾子(visibility modifiers)は、Javaに比べてKotlinで強化された重要な特徴です。これにより、クラス、関数、およびプロパティへのアクセスを制限し、カプセル化とモジュール性のベストプラクティスをサポートします。
問題:
可視性の不適切な使用は、アーキテクチャの層に違反する可能性があり、実装が外部に漏れたり、逆に必要な場所でクラスやメソッドがアクセス不能になったりします。このエラーはしばしば遅れて発見されます。
解決策:
Kotlinには4つの可視性修飾子があります:
public — どこでもアクセス可能(デフォルト)internal — 同一モジュール内のみアクセス可能protected — クラスとそのサブクラス内でアクセス可能private — ファイル、クラス、またはオブジェクト内でのみアクセス可能コード例:
open class Base { private fun onlyBase() {} protected fun baseAndDerived() {} internal fun insideModule() {} public fun anyone() {} } class Derived : Base() { fun test() { baseAndDerived() // アクセス可能 // onlyBase() — エラー } }
重要な特徴:
internal はKotlin特有であり、Javaには存在しませんprivateはファイルでの可視性を制限しますライブラリ公開時のinternal修飾子の動作はどうなりますか?
internalは同一モジュール内で要素を隠しますが、ライブラリをjar/aarにコンパイルすると、internal要素はリフレクションを通じて可視化されます。
クラスのプロパティとトップレベル関数のprivateの違いは何ですか?
クラスのプロパティに対するprivateは、そのクラス内でのみ可視性を制限しますが、トップレベルでは、その要素が宣言されているファイル内でのみ制限されます。
トップレベル関数にprotectedを適用できますか?
いいえ、protectedはクラスまたはインターフェースのメンバーにのみ許可されます。トップレベルにprotectedは使用できず、コンパイルエラーになります。
大規模なライブラリがほぼすべてのAPIをpublicとして宣言し、ユーティリティやヘルパーを含めた結果、ユーザーが実装の詳細に依存するようになった。
利点:
欠点:
必要なクラスのみをpublicとして宣言し、残りはinternalまたはprivateにし、可視性のレベルを明確に分けている。
利点:
欠点: