2016-02-25 58 views
0

比方說,我寫了下面的方法:如何避免java中的半重複方法組?

public void submitForm1() { 
     open(); 
     setField(1, "blah"); 
     setField(3, "bla"); 
     setField(4, "blah blah"); 
     submit(); 
    } 

public void submitForm2() { 
     open(); 
     setField(1, "blah"); 
     checkBox(1 , true); 
     submit(); 
} 

.... 

public void submitForm100() { 
     open(); 
     setField(1, "bla"); 
     setField(2, "bla bla"); 
     setField(3, "blah"); 
     setArea(1, "blah blah"); 
     submit(); 
} 

這些方法讓我覺得我不斷重複自己。我覺得它應該寫這樣的東西:

public void submitForm1() { 
     MyMethods.submitForm(
      {SET_FIELD, 1, "blah"}, 
      {SET_FIELD, 3, "bla"}, 
      {SET_FIELD, 4, "blah blah"} 
     ); 
    } 

public void submitForm2() { 
     MyMethods.submitForm(
      {SET_FIELD, 1, "blah"}, 
      {CHECKBOX, 1, true} 
     ); 
} 

.... 

public void submitForm100() { 
     MyMethods.submitForm(
      {SET_FIELD, 1, "bla"}, 
      {SET_FIELD, 2, "bla bla"}, 
      {SET_FIELD, 3, "blah"}, 
      {SET_AREA, 1, "blah blah"}, 
     ); 
} 

這樣我就不必重複所有打開和提交的方法一遍又一遍。

有沒有辦法做到這一點?

回答

2

您可以使用類似:

public interface FormSubmission { 
    void set(); 
    default submitForm() { 
    open(); 
    set(); 
    submit(); 
    } 
} 

然後,你的代碼看起來像:

Map<Integer, FormSubmission > forms = new HashMap<>(); 

//in constructor or static initialisation block: 
forms.put(1,() -> { setField(1, "blah"); 
        setField(3, "bla"); 
        setField(4, "blah blah"); }); 
//etc. 

public void submitForm(Integer i) { 
    forms.get(i).submitForm(); //probably want to handle NPE here 
} 

它與命令模式類似。

+0

看起來不錯:)。我會嘗試一下。 – Folatt

+0

謝謝!這是我正在尋找的。 – Folatt

1

我不這麼認爲,但你爲什麼不制定本辦法:

public void submit() { 
    open(); 
    switch(formNumber) { 
    case 1: 
    submitForm1(); 

    case 2: 
    submitForm2(); 

    case 100: 
    submitForm100(); 

    default: 
    break; 
    } 
    submit(); 
} 
+0

因爲他們是不同的形式。 – Folatt

3

例如,您可以使用「回調」。對於做這樣的事情:

void doInSubmit(SubmitCallback callback) 
{ 
    open(); 
    callback.call(); 
    submit(); 
} 

而且外面:

public void submitForm100() 
{ 
    doInSubmit(new SubmitCallback() 
    { 
     void call() 
     { 
      setField(1, "bla"); 
      setField(2, "bla bla"); 
      setField(3, "blah"); 
      setArea(1, "blah blah"); 
     } 
    })   
} 
+0

看起來不錯! – Folatt