Java Language
Свободный интерфейс
Поиск…
замечания
цели
Основная цель Свободного интерфейса - повышенная читаемость.
При использовании для построения объектов выбор, доступный для вызывающего, может быть четко и принудительно осуществлен с помощью проверок времени компиляции. Например, рассмотрим следующее дерево опций, представляющее шаги по пути для создания некоторого сложного объекта:
A -> B
-> C -> D -> Done
-> E -> Done
-> F -> Done.
-> G -> H -> I -> Done.
Строитель, используя свободный интерфейс, позволит вызывающему пользователю легко увидеть, какие опции доступны на каждом этапе. Например, A -> B возможен, но A -> C не является и приведет к ошибке времени компиляции.
Истина - Свободное тестирование
Из раздела «Как использовать правду» http://google.github.io/truth/
String string = "awesome";
assertThat(string).startsWith("awe");
assertWithMessage("Without me, it's just aweso").that(string).contains("me");
Iterable<Color> googleColors = googleLogo.getColors();
assertThat(googleColors)
.containsExactly(BLUE, RED, YELLOW, BLUE, GREEN, RED)
.inOrder();
Свободный стиль программирования
В беглом стиле программирования вы возвращаете this
из беглого (сеттера) методов, которые ничего не вернут в ненадежном стиле программирования.
Это позволяет вам связывать различные вызовы методов, которые делают ваш код короче и легче обрабатывать для разработчиков.
Рассмотрим этот непрозрачный код:
public class Person {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String whoAreYou() {
return "I am " + firstName + " " + lastName;
}
public static void main(String[] args) {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
System.out.println(person.whoAreYou());
}
}
Поскольку методы setter ничего не возвращают, нам нужно 4 инструкции в main
методе, чтобы создать экземпляр Person
с некоторыми данными и распечатать его. С быстрым стилем этот код можно изменить на:
public class Person {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public Person withFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public String getLastName() {
return lastName;
}
public Person withLastName(String lastName) {
this.lastName = lastName;
return this;
}
public String whoAreYou() {
return "I am " + firstName + " " + lastName;
}
public static void main(String[] args) {
System.out.println(new Person().withFirstName("John")
.withLastName("Doe").whoAreYou());
}
}
Идея состоит в том, чтобы всегда возвращать некоторый объект, чтобы создать построение цепочки вызовов метода и использовать имена методов, которые отражают естественную речь. Этот свободный стиль делает код более удобочитаемым.