2012-04-11 83 views
3

我有一个名为RawReader的类,它读取某些资源的字节,解析它们,然后将文件写入输出目录。关于允许许多不同类型构造函数的最佳实践?

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

  • 来源:字符串(文件或URL),URL,文件或InputStream的
  • 目的地:字符串(目录)或文件

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

另一方面,我可以只有两个构造函数接受(Object, Object)(Object, Object, int)。如果参数类型不正确,则可以检测到参数类型并引发IllegalArgumentException。

这种情况在Java中通常如何处理?

+0

这就是为什么我经常认为构造函数是邪恶的 - 它们像兔子一样繁殖! – ControlAltDel 2012-04-11 20:06:34

回答

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); 
    } 
} 

}

+0

感谢您的回答! :)阅读后,我环顾四周,发现[维基百科上的示例](http://en.wikipedia.org/wiki/Builder_pattern#Java),它在构建器中创建一个新对象,而不是返回该对象而不是传递本身到构造函数。是否有理由相对于另一方偏好? – Annan 2012-04-11 20:43:40

+0

无所谓,这是我猜想的首选问题 – Bozho 2012-04-11 20:47:51

0

所有的想法首先与(Object, Object, int)是可怕的,不走那条路!您放弃了强大的输入,IDE帮助和API清晰度。

在你的地方,我会限制构造函数最明显的/低电平输入你可以采取并提供制造商/工厂方法:

RawReader reader = RawReaderBuilder. 
    withInput(inputStream). 
    withOutput(someFile). 
    withChunkSize(). 
    build(); 
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 
    } 
} 
0

这是有道理的,允许不同类型的源 和目标,以构造传递英寸

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

(a)您不需要StringFile。决定一个,坚持下去。我会用File。这已经把施工人员的数量除以了4。(b)尽管存在先例,但您并不需要URLInputStream。摆脱'URL'会将数字除以2。

相关问题