我有以下方法:
protected ArrayList<String> prepInstaller(RemoteSession session) {
ArrayList<String> installCommand = new ArrayList<String>();
installer.setInstallOption(getCommand());
installer.setInstallProperties(generateInstallProperties());
installer.setTestHome(getTestHome(session));
switch (installer.getInstallOption()) {
case ("addon"):
installer.setAddOnScriptPath(getAddOnScriptPath(session, true));
installer.setAddOnImageLocation(getAddOnPath(session, true));
installCommand.add(installer.getInstallCommand());
break;
case ("install"):
installer.setImageLocation(getImageLocation(session, true));
installCommand.add(installer.getInstallCommand());
break;
case ("patch"):
case ("rollback"):
installer.setPatchLocationPath(getPatchPath(session, true));
for(String currentPatch: installer.getPatches()) {
installCommand.add(installer.getInstallCommand(currentPatch));
}
break;
}
return installCommand;
}
我的问题是这一行:
installCommand.add(installer.getInstallCommand());
包含installer.getInstallCommand()
,它将包含空对象,除非运行以下命令:
installer.setInstallOption(getCommand());
installer.setInstallProperties(generateInstallProperties());
installer.setTestHome(getTestHome(session));
其中......该方法依赖于以前运行的方法,这是不可取的。我已将installer
定义为静态工厂:
public static InstallData getInstance() {
if (instance == null) {
instance = new InstallData();
}
return instance;
}
我已经看过使用构建器模式,但它似乎有点笨拙。我无法找到它的整洁版本。我不想使用构造函数,因为它会很混乱,我需要它们中的几个。
我还尝试构造一个包含所有set
方法的对象,然后将该对象传递给一个返回getInstallCommand()
的新类,但这也很混乱。
欢迎提示:)
答案 0 :(得分:1)
正如在问题中指出的那样,在对象处于非法状态时,实例化对象或调用方法不是理想的行为。在大多数情况下,对象创建需要4个或更多参数但是其中一些参数可以有合理的默认值,可以通过要求必要的参数并替换可选的参数来使用伸缩构造函数(反)模式。
在其他情况下,特别是如果参数类似/相同类型,则使用构建器模式。它们不是一次指定所有参数,而是逐个设置,最后Builder
对象用于实例化所需的类。
这个问题涉及&#34;凌乱&#34;代码有几次。虽然对于任意代码都是如此,但设计模式is
对一个常见问题的一般可重用解决方案 在软件设计中给出了上下文。
因此,如果正确实施,它既可以用于用例,也可以不用,但它不应该是#34;凌乱&#34;。我还建议您查看常用design patterns的java实现。也许,可以找到一个更适合于问题域的替代方案。