3

我有一个名为 RawReader 的类,它读取某些资源的字节,解析它们,然后将文件写入输出目录。

允许将不同的类型作为源和目标传递给构造函数是有意义的。

  • Source: String (of file or URL), URL, File or InputStream
  • 目的地:字符串(目录)或文件

但是,如果我重载构造函数,就会给我留下 8 个不同的版本。例如,如果我想添加第三个可选参数,chunkSize 我将有 16 个构造函数!

另一方面,我可以只有两个构造函数接受(Object, Object)and (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

允许将不同的类型作为源和目标传递给构造函数是有意义的。

在一定程度上。然而,提供调用者自己可以轻松提供的转换并没有多大意义,特别是如果它会导致多达八个构造函数。所以:

(a) 你不需要两者StringFile。决定一个,并坚持下去。我会用File. 这已经将构造函数的数量除以四。

(b)尽管有先例,但你并不真的需要两者URLInputStream摆脱“URL”会将数字除以二。

于 2012-04-12T01:02:53.100 回答
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 回答