我有一个扩展另一个的课程。在构造函数中,我传递了一堆参数,但我现在意识到我需要根据我运行代码的内容传递不同的参数:
public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props) {
super(driver, parent, Boolean.FALSE, props,action.UK);
在此示例中,操作使用枚举中的UK值,我的问题是如果我在另一个客户端上运行此操作,我可能需要调用action.FR
有没有办法可以在构造函数中添加条件?例如,如果prop文件中的某些内容表示FR,则传递action.FR
答案 0 :(得分:3)
仅通过enum
传递constructor
值会更有意义吗?这样,无论用户放入什么,相同的构造函数都可以工作。
实施例
public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props, Country country) {
super(driver, parent, Boolean.FALSE, props, country);
}
// Assumes Country is your enum type. Was just a guess for a placeholder.
答案 1 :(得分:1)
在super()
来电之前你不能有条件,因为它需要成为第一个。另一方面,该语言不会阻止在调用中使用表达式,因此您可以:
super(driver, parent, Boolean.FALSE, props, getAction(props));
其中getAction()类似于:
private Action getAction(Properties props) {
...
请注意,为了安全起见,您不希望getAction()
成为可被子类覆盖的东西,因此它应该是私有的,最终的或静态的。 (否则,根据墨菲,有人会实现一个依赖于未完全初始化对象的状态)。
也就是说,最好使用类似工厂模式的东西。
答案 2 :(得分:0)
由于构造函数调用(在此示例中为super()
)需要首先在构造函数中调用 - 否,您不能。
解决这个问题的方法可以是制作两个不同的构造函数。
答案 3 :(得分:0)
我觉得你可以在这里使用Builder模式。当构造函数中的参数数量很多时,建议使用Builder模式。
客户端代码将指定他想要使用的操作类型。对于构建器模式,see
您的客户端代码如下所示:
SearchPageBuilder builder = new SearchPage.SearchPageBuilder();
builder.setDriver(driver);
builder.setLoadableComponent(parent);
builder.setProperties(props);
builder.setAction(action.UK);
SearchPage page = builder.build();