将标志(或不)传递给 Java 中的构造函数
Passing flags (or not) to a constructor in Java
例如,为大致相同的任务使用不同名称的方法是有意义的
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)
,其中 mode
是 "r"
、"rw"
等等。这对我来说感觉很笨重。
- 添加一个类似于
Files
的 copy(Path source, Path target, CopyOption... options)
的 enum
标志。感觉也很笨重。
- 具有不带参数的构造函数,然后像上面那样分离方法,以便在创建对象后立即调用。不太好,因为如果不使用指定文件中的数据实例化我的对象的实例是没有意义的。
目前我似乎更喜欢上面的数字 (6) 并且只是在无参数构造函数之后立即调用两个具有不同名称的方法。我是否忽略了任何选项,或者是否有针对这些情况的 "given" 方法?
编辑:正如下面其他人所指出的,当然有第 7 个,也许是最明显的选项:
- 使用工厂方法!
使用一长串参数创建构造函数 protected
,引入大量 public static
命名的 createFooWithBar()
方法,这些方法具有调用构造函数的精确参数列表。
将您的构造函数设为私有并添加 public 工厂方法。
我认为这是一种非常常见的模式。
另一种模式是"builder"。使构造函数只能由同一包的 类 访问。在同一个包中添加一个构建器(如果您愿意,可以添加多个构建器),它将调用构造函数并调用构造对象所需的任何其他方法。
例如,为大致相同的任务使用不同名称的方法是有意义的
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)
,其中mode
是"r"
、"rw"
等等。这对我来说感觉很笨重。 - 添加一个类似于
Files
的copy(Path source, Path target, CopyOption... options)
的enum
标志。感觉也很笨重。 - 具有不带参数的构造函数,然后像上面那样分离方法,以便在创建对象后立即调用。不太好,因为如果不使用指定文件中的数据实例化我的对象的实例是没有意义的。
目前我似乎更喜欢上面的数字 (6) 并且只是在无参数构造函数之后立即调用两个具有不同名称的方法。我是否忽略了任何选项,或者是否有针对这些情况的 "given" 方法?
编辑:正如下面其他人所指出的,当然有第 7 个,也许是最明显的选项:
- 使用工厂方法!
使用一长串参数创建构造函数 protected
,引入大量 public static
命名的 createFooWithBar()
方法,这些方法具有调用构造函数的精确参数列表。
将您的构造函数设为私有并添加 public 工厂方法。 我认为这是一种非常常见的模式。
另一种模式是"builder"。使构造函数只能由同一包的 类 访问。在同一个包中添加一个构建器(如果您愿意,可以添加多个构建器),它将调用构造函数并调用构造对象所需的任何其他方法。