将标记(或不标记)传递给Java

时间:2016-02-02 11:29:23

标签: java constructor instantiation flags enum-flags

对大致相同的任务使用不同名称的方法是有道理的,例如

  • open(String filename);
  • createThenOpen(String filename); // First create the file with default contents, then process the file.

这种命名方法对构造函数不起作用。想象一下,构造函数采用如上所示的文件名。我有各种选择来处理这两种情况:

  1. 构造函数中的If语句:如果文件不存在则创建它。这并不好,因为构造函数的行为是隐式的,调用者可能会创建不需要的文件而不是打开现有文件。
  2. 向构造函数添加标志:MyClass(String filename, boolean createNew)。不太好,因为像MyClass("hello.txt", true)这样的电话很神秘。
  3. 重载,以便单个参数始终假定文件存在,并且存在其他虚拟参数意味着应创建该文件。这也很难看。
  4. 添加字符串标记,如RandomAccessFile(File file, String mode) mode"r""rw"等。这对我的目的来说非常笨重。
  5. 添加enum - 类似于Files' s copy(Path source, Path target, CopyOption... options)的标记。感觉很笨重。
  6. 拥有不带参数的构造函数,然后在创建对象后立即调用上面的方法。不好看,因为没有使用指定文件中的数据实例化我的对象实例是没有意义的。
  7. 目前我似乎真的喜欢上面的数字(6),并且只是在无参数构造函数之后立即调用两个具有不同名称的方法。我是否忽略了任何选择,或者是否有一个"给定的"这些方案的方法是什么?

    编辑:正如其他人所指出的那样,当然还有第7个,也许是最明显的选择:

    1. 使用工厂方法!

2 个答案:

答案 0 :(得分:2)

使用一长串参数protected创建构造函数,引入许多public static名为createFooWithBar()的方法,其中包含调用构造函数的精确参数列表。

答案 1 :(得分:0)

将构造函数设为私有并添加公共工厂方法。 我认为这是一种非常常见的模式。

另一种模式是" builder"。使构造函数只能访问同一个包的类。在同一个包中添加一个构建器(如果您愿意,可以使用多个构建器),它将调用构造函数并调用构造对象所需的任何其他方法。