允许许多不同类型的构造函数的最佳实践?

时间:2012-04-11 20:02:54

标签: java

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

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

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

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

另一方面,我可以让两个构造函数接受(Object, Object)(Object, Object, int)。如果参数类型不正确,则可以检测到参数类型并抛出IllegalArgumentExceptions。

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

4 个答案:

答案 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)您不需要StringFile。决定一个,并坚持下去。我会用File。这已经将构造函数的数量除以4。

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