我有一个名为RawReader的类,它读取某些资源的字节,解析它们,然后将文件写入输出目录。
允许将不同类型作为源和目标传递给构造函数。
但是,如果我重载构造函数,让我有8个不同的版本。如果我想添加第三个可选参数,例如chunkSize
,我将有16个构造函数!
另一方面,我可以让两个构造函数接受(Object, Object)
和(Object, Object, int)
。如果参数类型不正确,则可以检测到参数类型并抛出IllegalArgumentExceptions。
这样的情况通常如何在Java中处理?
答案 0 :(得分:3)
您可以使用builder:
Foo foo = new FooBuilder().setFile(..).setChunkSize().build();
.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);
}
}
}
答案 1 :(得分:0)
首先,(Object, Object, int)
的一个想法很糟糕,不要这么做!您失去了强类型,IDE帮助和API清晰度。
在你的位置,我会将构造函数限制为你可以采取的最明显/最低级别的输入,并提供构建器/工厂方法:
RawReader reader = RawReaderBuilder.
withInput(inputStream).
withOutput(someFile).
withChunkSize().
build();
答案 2 :(得分: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
}
}
答案 3 :(得分:0)
允许将不同类型作为源传入是有意义的 和构造函数的目标。
一点。然而,提供调用者可以轻松提供自己的转换没有多大意义,特别是如果它将导致多达八个构造函数。所以:
(a)您不需要String
和File
。决定一个,并坚持下去。我会用File
。这已经将构造函数的数量除以4。
(b)尽管有先例,但你并不需要URL
和InputStream
。摆脱“URL”会将数字除以2。