2014-02-24 69 views
1

我有一个扩展另一个类的类。在构造函数中我通过在一堆争论,但现在我已经意识到我需要基于什么我运行的代码在不同的参数传递:根据参数在构造函数中调用不同的super()

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

在这个例子中动作用英国从枚举值,我的问题是,如果我在另一个客户端上运行我可能需要调用action.FR

有没有办法可以在构造函数中放置一个条件?例如,如果prop文件中的内容显示为FR,则通过action.FR

+0

如何定义两个不同的构造函数?通过差异因素作为参数。 – ray

+0

工厂功能?你可以把条件放在工厂里。不知道如果这是最好的选择,但它看起来很简单。 – user2357112

回答

3

通过constructor传递enum值是否更有意义? 。这样,相同的构造会的工作,不管是什么用户将在

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. 
0

由于构造函数调用(在这个例子中super())需要在构造函数中第一个电话 - 没有,你不能。

解决此问题的方法可以是例如制作两个不同的构造函数。

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(); 
1

super()调用之前你不能因为它需要的首要条件。在另一方面,语言不能防止在通话有表情,所以你可以有:

super(driver, parent, Boolean.FALSE, props, getAction(props)); 

其中的getAction()会是这样的:

private Action getAction(Properties props) { 
    ... 

请注意,为了安全,你做不想要getAction()是可以被子类覆盖的东西,所以它应该是私有的,最终的或静态的。 (否则,根据Murphy的说法,有人会根据不完全初始化的对象的状态来执行一个)。

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

相关问题