Javaには、クラスのパッケージ保護(デフォルト)修飾子があります。これにより、単一のパッケージに多くのクラスを含めることができますが、少数を公開し、ロジックをカプセル化します。
Kotlinでは、これはそうではないようです。相互に見える他のクラスをほとんど持たない場合、それ以上は見えない単一のファイルに可視性を制限するプライベート修飾子を使用する必要があります...パッケージ内のクラスとそのうちの1つだけが公開されました。すべてのクラスを含む1つの巨大なファイルがあります(そして、private
は至る所にあります)...
これは通常の慣行ですか、それともkotlinで同様のモジュール性を達成する方法はありますか?
彼らがパッケージの概念を持っているかどうか、なぜパッケージ保護されたアクセスを取り除くのか理解していません...
更新:すべての後にパッケージ保護された可視性があるかもしれません
ここの説明を参照
Kotlinは、Javaと比較して、パッケージモデルへの依存度が低いようです(たとえば、ディレクトリ構造はパッケージにバインドされていません)。代わりに、Kotlinは internal
visibility を提供します。これはモジュラープロジェクトアーキテクチャ用に設計されています。これを使用すると、コードの一部を別の module にカプセル化できます。
したがって、トップレベルの宣言では次を使用できます
private
はファイルの可視性を制限しますinternal
はモジュールへの可視性を制限しますこの時点では、可視性制限の他のオプションはありません。
@hotkeysが指摘しているように、 モジュール でinternal
キーワードを使用できます。私は通常、EclipseとMavenを使用していますが、これらのモジュールを作成するのは実用的ではありません。
IDEAまたはGradleを使用した別の技術スタックの場合は、より実用的です。これらを使用したことがないため、わかりません。
もう1つのオプションは、パッケージのすべてのクラスを単一のファイル内に配置することです。これは常に実用的でもエレガントでもありません。
私にとって、package
可視性はそのドキュメント化の価値にとって非常に役立ちます。あるパッケージがプロジェクトの残りの部分にどのパブリックインターフェイスを提示しているかを知りたい。ファクトリー実装クラスなどを隠したい。
だから、もしJavaでパッケージプライベートなクラスとメソッドにあなたの方法をハックすることができるとしても、package
キーワードを使いたいです。
私がやったことは、単一の注釈でプロジェクトを作成することです:
package com.mycompany.libraries.kotlinannotations;
import static Java.lang.annotation.ElementType.CONSTRUCTOR;
import static Java.lang.annotation.ElementType.METHOD;
import static Java.lang.annotation.ElementType.TYPE;
import static Java.lang.annotation.RetentionPolicy.SOURCE;
import Java.lang.annotation.Documented;
import Java.lang.annotation.Retention;
import Java.lang.annotation.Target;
@Documented
@Retention(SOURCE)
@Target({ TYPE, METHOD, CONSTRUCTOR })
/**
* Use in Kotlin code for documentation purposes.
*
* Whenever a Kotlin class or method is intended to be accesible at package level only.
*
*/
public @interface PackagePrivate {
}
その後、この注釈を任意のKotlinプロジェクトで使用できます。
2番目のステップは、まだ行っていないので、ある時点でやりたいことですが、PMDルールを作成して、これをmaven(またはその他のビルドツール)で強制し、確認することもできます。 my IDE pmdプラグインでのルール違反。
現時点では、Kotlinは pmd でサポートされている言語の1つではありません(つまり、独自のモジュールで)。しかし、PMDは活発に開発されており、Kotlinは人気が高まっているため、ある時点で開発される可能性があります。それはちょうど私の最高の推測です。