Этот фрагмент кода представляет собой смесь шаблонов команд и строителя:Самого выполнения команда
CommandBuilder.create("one value").execute();
CommandBuilder.create("another value").withBigDecimal(BigDecimal.ZERO).withNumber(123).execute();
все это делает простую печать:
one value
another value 123 0
Цель состоит в том, чтобы избавиться от execute()
метод. Это означает, что после последнего метода withXXX()
(или без какого-либо withXXX()
) код выполнил бы печать.
Вот текущий код:
import java.math.BigDecimal;
public class CommandBuilder {
private final String value;
private Integer number;
private BigDecimal bigDecimal;
private CommandBuilder(String value) {
this.value = value;
}
public static CommandBuilder create(String value){
return new CommandBuilder(value);
}
public CommandBuilder withNumber(Integer number){
this.number = number;
return this;
}
public CommandBuilder withBigDecimal(BigDecimal bigDecimal){
this.bigDecimal = bigDecimal;
return this;
}
public void execute(){
StringBuilder sb = new StringBuilder();
sb.append(value);
if(number != null){
sb.append(" ").append(number);
}
if(bigDecimal != null){
sb.append(" ").append(bigDecimal);
}
System.out.println(sb);
}
}
Возможно ли это в Java?
EDIT ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Может быть, моя ошибка в том, что я не давал никакой информации о намерениях. Я попытался запутать проблему, чтобы она не усложнялась и слишком широка для ответа.
Таким образом, этот фрагмент кода является DSL. Это самый простой случай, когда команды просто выполняют действие (например, хранят некоторую информацию в базе данных). Другой случай - когда команда должна вернуть значение (полная реализация шаблона Builder с помощью метода build()
), но в этом случае нет проблемы, вызывающей возврат, если всегда последний метод в цепочке.
Я думаю, что настоящая проблема: Как отложить оценку до тех пор, пока вся цепочка методов построения не обработана?
Мне нравится ваш дизайн - это самый простой и четкий способ. Тем не менее он меняет API. Я должен сказать, что при использовании последнего подхода (где Consumer управляет всеми параметрами) у вас нет возможности принудительно вводить обязательные параметры во время компиляции. Поэтому первое использование лучше всего подходит. – pawelccb