2014-02-24 144 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的說法,有人會根據不完全初始化的對象的狀態來執行一個)。

也就是說,最好使用類似工廠模式的東西來代替。

相關問題