1

例如,为大致相同的任务使用不同名称的方法是有意义的

  • 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)where modeis "r""rw"依此类推。对于我的目的来说,这感觉非常笨拙。
  5. 添加一个enum类似于Files's的 -flag copy(Path source, Path target, CopyOption... options)。感觉也很笨拙。
  6. 具有不带参数的构造函数,然后在创建对象后立即调用像上面这样的单独方法。不好,因为没有使用指定文件中的数据实例化我的对象的实例是没有意义的。

目前,我似乎实际上更喜欢上面的数字 (6),并且只需在无参数构造函数之后立即调用两个具有不同名称的方法。我是否忽略了任何选项,或者是否有针对这些场景的“给定”方法?

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

  1. 使用工厂方法!
4

2 回答 2

2

用一长串参数创建你的构造函数protected,引入许多带有精确参数列表的public static命名createFooWithBar()方法来调用你的构造函数。

于 2016-02-02T11:32:17.233 回答
0

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

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

于 2016-02-02T11:37:48.167 回答