3

あるリソースのバイトを読み取り、それらを解析してから、ファイルを出力ディレクトリに書き込むRawReaderというクラスがあります。

さまざまな型をソースおよび宛先としてコンストラクターに渡すことができるようにすることは理にかなっています。

  • ソース:(ファイルまたはURLの)文字列、URL、ファイルまたはInputStream
  • 宛先:文字列(ディレクトリ)またはファイル

ただし、コンストラクターをオーバーロードすると、8つの異なるバージョンが残ります。たとえば、3番目のオプションの引数を追加したい場合は、chunkSize 16個のコンストラクターがあります。

一方、(Object, Object)とを受け入れる2つのコンストラクターを持つことができ(Object, Object, int)ます。引数の型が検出され、正しくない場合はIllegalArgumentExceptionsがスローされる可能性があります。

このような状況は通常Javaでどのように処理されますか?

4

4 に答える 4

3

あなたはビルダーを使うことができます:

Foo foo = new FooBuilder().setFile(..).setChunkSize().build();

Where.build()は、そのコンストラクターを呼び出し、Fooビルダーを取得して、設定されている変数を割り当てます。そんな感じ:

パブリッククラスFoo{

private Foo(FooBuilder builder) {
    //get whatever you can find from the builder to fill the state of Foo
}
public static FooBuilder {
     private String filename;
     private File file;
     private InputStream stream;
     private int chunkSize;
     // getters and setters
     public Foo build() {
         return new Foo(this);
     }
}

}

于 2012-04-11T20:07:47.817 に答える
0

まず第一に、のアイデア(Object, Object, int)はひどいです、そのように行かないでください!強いタイピング、IDE支援、APIの明確さを失います。

あなたの場所で、私はコンストラクターをあなたが取ることができる最も明白な/低レベルの入力に制限し、ビルダー/ファクトリメソッドを提供します:

RawReader reader = RawReaderBuilder.
  withInput(inputStream).
  withOutput(someFile).
  withChunkSize().
  build();
于 2012-04-11T20:08:52.670 に答える
0

同じシグニチャを持つコンストラクタが見つかった場合は、異なる名前のファクトリメソッドを使用できます。

public class Foo {

    public static Foo createForDir(String dir) {
        // create a Foo as you like and return it
    }

    public static Foo createForUrl(String url) {
        // create a Foo as you like and return it
    }
}
于 2012-04-11T20:15:06.123 に答える
0

さまざまな型をソースおよび宛先としてコンストラクターに渡すことができるようにすることは理にかなっています。

ある程度まで。ただし、特に8つものコンストラクターにつながる場合は、呼び出し元が自分で簡単に提供できる変換を提供することはあまり意味がありません。それで:

String(a)との両方は必要ありませんFile。1つを決定し、それに固執します。私は使用しますFile。これで、コンストラクターの数はすでに4で除算されています。

(b)前例はありますが、実際には両方URLとどちらかは必要ありません。InputStream'URL'を削除すると、数値が2で除算されます。

于 2012-04-12T01:02:53.100 に答える