Эффективно реализовать шаблон команд - PullRequest
0 голосов
/ 14 января 2019

Исходный код:

public void updateState(final int state)
{
    preSet();
    itsState = state;
    postSet();
}
public void setTitle(final String title)
{
    preSet();
    itsTitle = title;
    postSet();
}

После моей реализации шаблона команд:

public void updateState(final int state)
{
  CallableManager.doInTransaction(new Callable<Void>()
  {
     @Override
     public Void execute()
     {
       itsHiddenNodes = hiddenNodes;
       return null;
     }
  });
}
public void setTitle(final String title)
{
  CallableManager.doInTransaction(new Callable<Void>()
  {
     @Override
     public Void execute()
     {
       itsTitle = title;
       return null;
     }
  });
}

Этот интерфейс создан для метода pass в качестве параметра.

private interface Callable<T>
{
    public T execute();
}

Этот класс создан для управления шаблоном команд.

private class CallableManager
{
    public <T> static void doInTransaction(final Callable<T> callable)
    {
        preSet();
        callable.execute();
        postSet();
    }
}

Как вы видите, реализация шаблона команды не выглядит очень эффективной, по крайней мере, как строка кода для этого примера. В этом примере я реализую шаблон команды для выхода из повторяющегося кода и уменьшения строки кода. Но в результате они оба не предусмотрены для этого примера. Пожалуйста, дайте мне совет. Как эффективно использовать шаблон команд?

1 Ответ

0 голосов
/ 15 января 2019

Лямбда может значительно уменьшить дублирование кода. Кроме того, Runnable кажется более подходящим интерфейсом, чем Callable, поскольку вы не возвращаете значение.

public class MainJava {
    private int state;
    private String title;

    public static void main(String... args) {
        MainJava mj = new MainJava();
        mj.setState(42);
        mj.setTitle("My Title");
    }

    public void setState(int state) {
        doInTransaction(() -> this.state = state);
    }
    public void setTitle(String title) {
        doInTransaction(() -> this.title = title);
    }

    private void doInTransaction(Runnable runnable) {
        preSet();
        runnable.run();
        postSet();
    }

    private void preSet() {
        System.out.println("preset");
    }
    private void postSet() {
        System.out.println("post-set");
    }
}
...