1

クラスコンストラクターをパッケージスコープの外に隠し(他のいくつかのセッターとともに)、潜在的なパッケージユーザーにビルダーを介してのみこの特定のクラスを取得させようとしています(明確さと検証の理由から)。

これまでのところ、そのクラスとそのビルダーを同じパッケージに入れ、隠したいすべてのメソッドに対してパッケージの可視性を宣言することで、この目標を達成してきました。ただし、これにはいくつかの欠点があります。これにより、より堅固なパッケージ構造が課せられ、ユーザーがクラス ビルダーを拡張する可能性が制限されます。

代替ソリューションまたはパターンに興味がありますか? Javaに「モジュール」可視性修飾子を導入するという噂を少し前に聞いたことがありますが(これで問題は解決すると思います)、彼らはその考えを捨てたと思います。

4

4 に答える 4

1

-protected アクセス修飾子を使用して、そのパッケージ外のコンストラクター コードのアクセスを制限します。

例えば:

public class FilePro {

    protected FilePro(){      // This block is accessible only
                          // within this package

    }

}
于 2012-11-23T12:46:41.303 に答える
0

まず、クライアントを信頼するのではなく、製品に完全な検証(および可変値のコピー)を入れることをお勧めします。

クライアントが使用しているビルダーインターフェイスを製品から分離する場合は、その間接層を追加します。

最も単純なのは、製品に巨大なパラメーターリストを持つコンストラクターを公開させ、通常のコンストラクターの責任を実行させることです(可変のコピー、引数の検証、およびオブジェクトが使用可能な状態に初期化されることの確認)。ビルダーは、別の依存パッケージ/モジュール/ jar /ライブラリーにあり、コンストラクター・インターフェースを使用できます。

これで、大きなコンストラクターに戻ります。これはいくつかの方法で修正できます。たとえば、他のオブジェクトが使用できる同じクラス/パッケージ/モジュール内に正規のビルダーを含めることができます。

getまたは、コンストラクターの各パラメーターを置き換える「get」メソッド(プレフィックスを削除します。getsのタイプでは無意味です)を使用するインターフェイスを使用することもできます。製品コンストラクターは、単一の引数のみを必要とし、各引数をプルできるようになりました。各ビルダーは、製品のビルドを完了するときに、(たとえば)匿名の内部クラスとしてインターフェイスを実装できます。

于 2012-11-23T15:48:44.943 に答える
0

私はJavaをあまり扱っていませんが、クラスのインスタンスを作成する静的メソッドを宣言することができると思います

public static build()
{
 return new FilePro();
}

そうすれば、同じパッケージからのみクラスの新しいインスタンスを作成でき、制限なしでクラスを拡張できます

于 2012-11-23T13:40:33.840 に答える
0

public Builder 静的内部クラスを使用します。

public class OuterClass{

    private MyType1 field1;
    private MyType2 field2;

    private OuterClass(MyType1 field1, MyType2 field2){....} 

    public static class Builder{
        private static final MyType1 DEFAULT_VALUE_1 = something;
        private static final MyType2 DEFAULT_VALUE_2 = somethingelse;

        private MyType1 field1=DEFAULT_VALUE_1;
        private MyType2 field2=DEFAULT_VALUE_2;

        public Builder() {...}

        public setFiled1(MyType1 field1) { this.field1 = field1)
        public setFiled2(MyType2 field2) { this.field2 = field2)

        public OuterClass build() { return new OuterClass(field1,field2);}
    }
}

さらに堅牢にするために、outerClass final のフィールドを作成します

于 2012-11-23T12:49:34.520 に答える