2015-08-23 78 views
1

我想替換if else聲明:如何替換命令模式的靜態元素初始化?

if (userSalutation.equalsIgnoreCase("mr")) { 
     screenPage.selectMr(); 
    } else { 
     screenPage.selectMs(); 
    } 

selectMr()執行只需點擊此按鈕。

With Command pattern implementation。
使用枚舉實現此目的。

我如果要使用網頁元素(按鈕):

enter image description here

代碼片斷

public class ScanScreenPageStep1 extends PageObject { 
    public ScanScreenPageStep1() { 
     PageFactory.initElements(new EasyWebFieldDecorator(getDriver()), this); 
    } 
    @FindBy(id = "salutation") 
    protected Button mr; 

    @FindBy(id = "salutation2") 
    protected Button ms; 

這裏是枚舉尋找

public enum PersonSalutations { 
     MR("mr") { 
      @Override 
      public Button getButton() { 
       return mr; 
      } 
     },  
     MS("ms") { 
      @Override 
      public Button getButton() { 
       return ms; 
      } 
     }; 
     private String salutation; 

     PersonSalutations(String salutation) { 
      this.salutation = salutation; 
     } 

     public static final Map<String, Button> stringToButton = new HashMap<>();    
     static { 
      for (PersonSalutations salut : values()) { 
       stringToButton.put(salut.toString(), salut.getButton()); 
      } 
     } 

     public String getSalutation() { 
      return salutation; 
     } 

     public abstract Button getButton(); 

     public static Button fromString(String stringSalutation) { 
      return stringToButton.get(stringSalutation); 
     }  

     @Override 
     public String toString() { 
      return salutation.toUpperCase(); 
     } 
    } 

對於添加按鈕元素stringToButton我必須讓我的按鈕素靜:

@FindBy(id = "salutation") 
protected static Button mr; 

@FindBy(id = "salutation2") 
protected static Button ms; 

如何避免在這種情況下,靜態元素?

或在這種情況下的一些其他情況。

回答

0

您的enum定義了概念按鈕,而protected Button mr定義了該按鈕的實例。除了單例模式之外,這就像是要求Class獲得該類的一個實例。你的代碼有多個Button的實例,所以singleton在這裏不適用。

你應該將getButtonScanScreenPageStep1如下:

public Button getButton(PersonSalutations s) { 
    if (s == PersonSalutations.MR) 
     return this.mr; 
    if (s == PersonSalutations.MS) 
     return this.ms; 
    throw new IllegalArgumentException("Invalid: " + s); 
} 

作爲替代,作爲參數添加ScanScreenPageStep1getButton,所以枚舉稱爲「第1步」實例來獲得的按鈕。