如何在java中避免半重复的方法组?

时间:2016-02-25 12:05:32

标签: java methods reflection dry

假设我写了以下几种方法:

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

这样我就不必重复所有这些打开并一遍又一遍地提交方法。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:3)

例如,您可以使用"回调" 。为此,做这样的事情:

obj.getJSONObject("error").getString("message") ;

外面:

obj.getString("message") ;

答案 1 :(得分: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
}

它类似于命令模式。

答案 2 :(得分:1)

我不这么认为,但为什么不这样做:

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

    case 2:
    submitForm2();

    case 100:
    submitForm100();

    default:
    break;
  }
  submit();
}