web-dev-qa-db-ja.com

kotlinのパッケージ保護された代替

Javaには、クラスのパッケージ保護(デフォルト)修飾子があります。これにより、単一のパッケージに多くのクラスを含めることができますが、少数を公開し、ロジックをカプセル化します。

Kotlinでは、これはそうではないようです。相互に見える他のクラスをほとんど持たない場合、それ以上は見えない単一のファイルに可視性を制限するプライベート修飾子を使用する必要があります...パッケージ内のクラスとそのうちの1つだけが公開されました。すべてのクラスを含む1つの巨大なファイルがあります(そして、privateは至る所にあります)...

これは通常の慣行ですか、それともkotlinで同様のモジュール性を達成する方法はありますか?

彼らがパッケージの概念を持っているかどうか、なぜパッケージ保護されたアクセスを取り除くのか理解していません...

更新:すべての後にパッケージ保護された可視性があるかもしれません
ここの説明を参照

44
vach

Kotlinは、Javaと比較して、パッケージモデルへの依存度が低いようです(たとえば、ディレクトリ構造はパッケージにバインドされていません)。代わりに、Kotlinは internal visibility を提供します。これはモジュラープロジェクトアーキテクチャ用に設計されています。これを使用すると、コードの一部を別の module にカプセル化できます。

したがって、トップレベルの宣言では次を使用できます

  • privateはファイルの可視性を制限します
  • internalはモジュールへの可視性を制限します

この時点では、可視性制限の他のオプションはありません。

32
hotkey

@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は人気が高まっているため、ある時点で開発される可能性があります。それはちょうど私の最高の推測です。

5
DPM