根据参数在构造函数中调用不同的super()

时间:2014-02-24 11:08:14

标签: java constructor conditional-statements extends super

我有一个扩展另一个的课程。在构造函数中,我传递了一堆参数,但我现在意识到我需要根据我运行代码的内容传递不同的参数:

public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props) {
    super(driver, parent, Boolean.FALSE, props,action.UK);

在此示例中,操作使用枚举中的UK值,我的问题是如果我在另一个客户端上运行此操作,我可能需要调用action.FR

有没有办法可以在构造函数中添加条件?例如,如果prop文件中的某些内容表示FR,则传递action.FR

4 个答案:

答案 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();