簡體   English   中英

如何避免在Java中半重復方法組?

[英]How can I avoid semi-repeating groups of methods in 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"},
        );
}

這樣,我將不必一遍又一遍地重復所有這些打開和提交方法。

有沒有辦法做到這一點?

例如,您可以使用“回調” 為此,請執行以下操作:

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");
        }
    })        
}

您可以使用類似:

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
}

它類似於命令模式。

我不這么認為,但是為什么不這樣做:

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

    case 2:
    submitForm2();

    case 100:
    submitForm100();

    default:
    break;
  }
  submit();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM