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

Очень часто у нас есть код, который создает такие объекты:

public Person generatePerson() {
	Person person = new Person();
	person.setFirstName("FirstName");
	person.setLastName("LastName");
	person.setAge(15);
	person.setSex("M");
	person.setCity("City");
	person.setHairColor("Black");
	return person;
}

Классическое картографирование. Мы инициализируем объект, затем помещаем некоторые данные в сеттеры и затем возвращаем объект. Вот как выглядит Person object:

class Person {
  private String firstName;
  private String lastName;
  private int age;
  private String sex;
  private String city;
  private String hairColor;
  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;
  }
  
  // The rest of the getters/setters are
  // using the same pattern
  // ...
}

У нас есть для них поля, геттеры и сеттеры. Классический.

Теперь, чтобы реализовать шаблон, мы вносим два простых изменения во все методы установки. Из этого:

public void setHairColor(String hairColor) {
    this.hairColor = hairColor;
}

К этому:

public Person setHairColor(String hairColor) {
    this.hairColor = hairColor;
    return this;
}

Изменение простое: после каждого набора мы возвращаем текущий объект или так называемое «this».

Сделаем это для всех сеттеров:

class Person {
     private String firstName;
     private String lastName;
     private int age;
     private String sex;
     private String city;
     private String hairColor;
     public String getFirstName() {
	  return firstName;
     }
	
     public ServiceMappingDTO setFirstName(String firstName) {
	  this.firstName = firstName;
	  return this;
     }
	
     public String getLastName() {
	  return lastName;
     }
	
     public ServiceMappingDTO setLastName(String lastName) {
	  this.lastName = lastName;
	  return this;
     }
    
    // The rest of the getters/setters are
    // using the same pattern
    // ...
    
}

Вы спросите, что это за изменение? И я вам сразу показываю.

public Person generatePerson() {
	return new Person()
		.setFirstName("FirstName")
		.setLastName("LastName")
		.setAge(15)
		.setSex("M")
		.setCity("City")
		.setHairColor("Black");
}

Посмотрите, сколько подробного кода мы удалили. Это поток: сначала мы создаем новый объект Person, который возвращает новый объект. Затем мы говорим - этот новый объект .setFirstName. Затем метод setFirstName устанавливает имя, а затем возвращает тот же объект (this). Затем мы можем сделать для него .setLastName и так далее. Мы можем объединить эти методы в цепочку.

Подсказка: если вы пишете геттеры и сеттеры вручную - прекратите это делать! Все современные IDE имеют простой способ их создания. IntelliJ даже имеет возможность генерировать установщики Fluent interface.

Прежде чем вы уйдете - наш удивительный курс чистого кода

Если вам понравилась эта статья, вам понравится наш курс:

  • 46 лекций
  • 3 часа контента
  • Работа над реальным проектом, который проверит ваши знания
  • 27 загружаемых ресурсов
  • 30-дневная гарантия возврата денег

Вы можете записаться на курс здесь - Чистый код: взлетайте до небес за 7 дней