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

Java 根据参数在构造函数中调用不同的super(),java,constructor,conditional-statements,extends,super,Java,Constructor,Conditional Statements,Extends,Super,我有一个类扩展了另一个类。在构造函数中,我传入了一组参数,但现在我意识到我需要根据运行代码的内容传入不同的参数: public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props) { super(driver, parent, Boolean.FALSE, props,action.UK); 公共搜索页面(WebDriver驱动程序、LoadableComponent父级、属

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

public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props) {
    super(driver, parent, Boolean.FALSE, props,action.UK);
公共搜索页面(WebDriver驱动程序、LoadableComponent父级、属性道具){
super(driver、parent、Boolean.FALSE、props、action.UK);
在本例中,操作使用枚举中的UK值,我的问题是如果在另一个客户端上运行此操作,可能需要调用action.FR


有没有一种方法可以将条件放入构造函数中?例如,如果prop文件中的某个内容说FR,则传递action。FR

通过
构造函数将
枚举值传入不是更有意义吗?这样,无论用户输入什么,同一个构造函数都会工作

范例

公共搜索页面(WebDriver驱动程序、LoadableComponent父级、属性道具、国家/地区){
超级(驱动程序、父级、布尔值.FALSE、道具、国家/地区);
}
//假设国家是您的枚举类型。这只是占位符的猜测。

通过
构造函数传入
enum
值不是更有意义吗?这样,无论用户输入什么,同一个构造函数都会工作

范例

公共搜索页面(WebDriver驱动程序、LoadableComponent父级、属性道具、国家/地区){
超级(驱动程序、父级、布尔值.FALSE、道具、国家/地区);
}
//假设国家是您的枚举类型。这只是占位符的猜测。
因为构造函数调用(在本例中为
super()
)需要是构造函数中的第一个调用-不,不能

例如,解决此问题的方法是创建两个不同的构造函数。

因为构造函数调用(在本例中为
super()
)需要是构造函数中的第一个调用-不,您不能


解决此问题的方法可以是创建两个不同的构造函数。

我觉得您可以在这里使用生成器模式。当构造函数中的参数很多时,建议使用生成器模式

客户端代码将指定他要使用的操作类型。对于生成器模式

您的客户端代码如下所示:

SearchPageBuilder builder = new SearchPage.SearchPageBuilder();
builder.setDriver(driver);
builder.setLoadableComponent(parent);
builder.setProperties(props);
builder.setAction(action.UK);
SearchPage page = builder.build();

我觉得您可以在这里使用生成器模式。当构造函数中的参数数量很多时,建议使用生成器模式

客户端代码将指定他要使用的操作类型。对于生成器模式

您的客户端代码如下所示:

SearchPageBuilder builder = new SearchPage.SearchPageBuilder();
builder.setDriver(driver);
builder.setLoadableComponent(parent);
builder.setProperties(props);
builder.setAction(action.UK);
SearchPage page = builder.build();

在调用
super()
之前不能有条件,因为它必须是第一个条件。另一方面,该语言不阻止调用中包含表达式,因此可以有:

super(driver, parent, Boolean.FALSE, props, getAction(props));
其中getAction()类似于:

private Action getAction(Properties props) {
    ...
注意,为了安全起见,您不希望
getAction()
是可以被子类重写的东西,因此它应该是私有的、最终的或静态的(否则,根据Murphy的说法,有人将根据未完全初始化对象的状态实现一个)


也就是说,最好使用类似工厂模式的模式。

在调用
super()
之前不能有条件,因为它必须是第一个。另一方面,该语言不阻止在调用中使用表达式,因此您可以:

super(driver, parent, Boolean.FALSE, props, getAction(props));
其中getAction()类似于:

private Action getAction(Properties props) {
    ...
注意,为了安全起见,您不希望
getAction()
是可以被子类重写的东西,因此它应该是私有的、最终的或静态的(否则,根据Murphy的说法,有人将根据未完全初始化对象的状态实现一个)


也就是说,最好使用类似工厂模式的东西。

定义两个不同的构造函数如何?将差异因子作为参数传递。工厂函数?您可以将条件放入工厂。不知道这是否是最好的选择,但它看起来很简单。定义两个不同的构造函数如何?传递区分因子作为一个参数。工厂函数?你可以把条件放在工厂里。不知道这是不是最好的选择,但看起来很简单。