2016-03-10 15 views
25

Javaでは、クラスの多くのクラスを1つのパッケージに持つことができますが、わずかしか公開せず、ロジックをカプセル化したままにすることができます。kotlinのパッケージプロテクトされた代替

kotlinでは、他のいくつかのクラスをお互いに見えるようにしたいのですが、それ以上のことはありませんが、私は1つのファイルの可視性を制限するprivate修飾子を使用する必要があります。パッケージに10のクラスがあり、そのうちの1つだけが公開されていれば、その中のすべてのクラス(そしてprivate)が1つの巨大ファイルになります。

これは通常の練習ですか? kotlinで同様のモジュール性を達成する方法ですか?

彼らは、パッケージ保護されたアクセスを取り除くなぜパッケージの概念を持っている場合、私は理解していない

...

答えて

19

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

ので、トップレベルの宣言に使用すると、この時点で、モジュール

に可視性を制限するファイル

  • internalに可視性を制限するために

    • privateを使用することができ、他にはありません可視性制限のオプション。

  • +4

    まあ、私は内部を好きですが、私たちは、誰かがモジュール性に違反するという非常に決定された後、すべての場合...しかし、私は決して誰かがコードを使用して、同じパッケージを作成しているのを見java9にはるかに優れた固定ことがあります彼は必要に応じてコードを貼り付けてコピーします...私がここで気にしているのは使いやすさです。ちょうど1つのファイルにコードのトンを入れているだけでは、私は実際に見た - と - そのことをダムです... – vach

    +1

    @vach。いくつかのライブラリは、あなたのユースケースに不満を感じています(良い練習ではありません) – Lovis

    +2

    今、私はJavaプロジェクトをkotlinに移行していますが、私は可視性が非常に高く、tipicalyで構成されています4-5クラスのうちの1つだけが外界に見えるクラスです...今、kotlinでは、同じファイルにすべてを入れない限り、同じ可視性を持つオプションはありません...正しく理解するのか、それとも他のものがありますか私は知らないアプローチ? – vach

    2

    @hotkeysが指摘するように、moduleにはinternalというキーワードを使用できます。私は通常、EclipseとMavenで作業しますが、これらのモジュールを作成するのは現実的ではありません。

    多分、IDEAまたはGradleを持つ別のテックスタックの方が実用的です。私は決してそれらを使用しなかったので私は知らない。

    もう1つの選択肢は、パッケージのすべてのクラスを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番目のステップは、ある時点でMaven(または他のビルドツール)を使ってこれを強制するPMDルールを作成することです。私のIDEでpmdプラグインを使ってルールの違反を見ることができます。(独自のモジュールでIE)Kotlinはまだpmdでサポートされている言語の一つではない瞬間

    。しかし、PMDは積極的に開発されており、Kotlinは人気が高まっているため、ある時点で開発される可能性があります。それは私の最高の推測です。