例如,为大致相同的任务使用不同名称的方法是有意义的
open(String filename);
createThenOpen(String filename); // First create the file with default contents, then process the file.
这种命名方法不适用于构造函数。想象一下构造函数采用上面的文件名。我有多种选择来处理这两种情况:
- 构造函数中的 if 语句:如果文件不存在,则创建它。这不好,因为构造函数的行为是隐式的,调用者可能会创建不需要的文件而不是打开现有文件。
- 向构造函数添加一个标志:
MyClass(String filename, boolean createNew)
. 不是很好,因为像这样的电话MyClass("hello.txt", true)
是神秘的。 - 重载使得单个参数始终假定文件存在,并且附加虚拟参数的存在意味着应该创建文件。这也是丑陋的。
- 添加一个字符串标志,如
RandomAccessFile(File file, String mode)
wheremode
is"r"
,"rw"
依此类推。对于我的目的来说,这感觉非常笨拙。 - 添加一个
enum
类似于Files
's的 -flagcopy(Path source, Path target, CopyOption... options)
。感觉也很笨拙。 - 具有不带参数的构造函数,然后在创建对象后立即调用像上面这样的单独方法。不好,因为没有使用指定文件中的数据实例化我的对象的实例是没有意义的。
目前,我似乎实际上更喜欢上面的数字 (6),并且只需在无参数构造函数之后立即调用两个具有不同名称的方法。我是否忽略了任何选项,或者是否有针对这些场景的“给定”方法?
编辑:正如下面其他人所指出的,当然还有第 7 个,也许是最明显的选项:
- 使用工厂方法!