Эта статья разделена на две части:
- Статья 2 главы 2 Эффективной книги Java
遇到多个构造器参数时要考虑使用构建器
Сделайте сброс. - Ломбок просто реализует эту функцию, давайте изучим некоторые способы использования ломбока.
Что такое строители и почему вы должны их использовать
Предположим, у класса теперь есть 3 обязательных атрибута и 5 необязательных атрибутов (для простоты кода позже будет написан только один обязательный атрибут и 2 необязательных атрибута. Просто поймите).
Итак, теперь я хочу предоставить идеальный创建该类的机制
,Что мы можем с этим поделать?
Во-первых, это метод 1 - используйте перекрывающиеся конструкторы.
Перекрывающиеся конструкторы
Это метод, с которым знаком каждый.Существует много перегруженных методов построения, и каждый параметр разный.Всегда найдется подходящий для вас!
public class Student {
// 必选
String name;
// 可选
int age;
String title;
public Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, String title) {
this.name = name;
this.age = age;
this.title = title;
}
}
Являются ли три метода построения головной болью? Обратите внимание, что в реальном коде классы с 30 атрибутами не редкость. О, это сложно писать.
И у этого тоже есть недостаток, читаемость слишком плохая, лучше при записи, при вызове вы увидите, что компилятор напомнит вам, что есть 30 конструкторов для вызова, и отобразит только тип параметра, а не отобразит имя параметра (такое как конструктор с 8 параметрами int, призрак знает, в каком порядке он должен быть передан), вы вообще не знаете, как его использовать....
Тогда есть второй способ:
javabean, то есть с помощью сеттеров.
Предоставьте метод set для каждого свойства, чтобы клиенты могли вызывать метод set для передачи нужных им параметров.
public class Student {
// 必选
private String name;
// 可选
private int age;
private String title;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setTitle(String title) {
this.title = title;
}
}
код вызова:
Student student = new Student();
student.setName("huyan");
student.setAge(1);
student.setTitle("666");
Как это выгодно читаемо, но плохое место не безопасно, вы не знаете, что клиент будет странным способом использования вашего класса.
Можно использовать шаблон Builder.
public class Student {
// 必选
private String name;
// 可选
private int age;
private String title;
private static class Builder {
// 必选
private String name;
// 可选
private int age;
private String title;
public Builder(String name) {
this.name = name;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder title(String s) {
this.title = s;
return this;
}
public Student build() {
return new Student(this);
}
}
private Student(Builder builder) {
name = builder.name;
age = builder.age;
title = builder.title;
}
Здесь есть несколько важных моментов:
- Конструктор класса Student приватизирован, поэтому, если вы хотите создать нового Student, вы должны использовать Builder.
- Builder имеет только один метод построения, который передает требуемые параметры, что гарантирует, что каждый Student будет иметь требуемые параметры.
- Предоставляет метод с тем же именем для всех необязательных параметров, так что необязательный параметр может быть установлен при возврате самого себя.
- Строитель предоставляет метод сборки, который вызывает частную конструктор студента и возвращает объект.
Метод вызова клиента выглядит следующим образом:
public static void main(String[] args) {
Student s = new Builder("huyan").age(11).title("888").build();
}
Использование шаблона Builder обеспечивает преимущества двух других описанных выше методов: безопасность и удобочитаемость.
- Параметры ограничены, и наличие требуемых параметров гарантировано.
- Хорошая читаемость, передайте каждый необязательный параметр и вызовите метод отдельно, вы можете четко знать значение каждого параметра.
- Связанные вызовы выглядят красиво.
Вау, есть ли обратная сторона такого высокомерия!
Конечно, есть:
- Эта производительность, безусловно, влияет на создание более чем объекта, поэтому сцена может ограничивать требования к производительности.
- Кода больше, чем перекрывающихся конструкторов... и писать его утомительно.
Подождите, вы всегда пишете класс Builder? Ломбок понять? Вам нужна только одна аннотация, чтобы добиться вышеуказанного эффекта~.
Итак, давайте научимся использовать ломбок.
lombok
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
lombok — это набор небольших инструментов, которые могут помочь вам уменьшить шаблон или реализовать другие функции.
Роль ломбока работает только в исходном коде, то есть ломбок поможет вам добавить некоторые вещи в процессе компиляции, так что вам не придется писать это самостоятельно, и как только файл класса сгенерирован, роль Ломбок закончился.
Builder:
Во-первых, давайте посмотрим, как реализован упомянутый выше Builder.
Очистите код класса Student, оставьте только свойства, а затем добавьте имя класса.@Builder
аннотация:
@Builder
public class Student1 {
// 必选
private String name;
// 可选
private int age;
private String title;
}
Затем используйте IDEA для компиляции, а затем просмотрите файл класса, Idea автоматически декомпилирует и получит для нас исходный файл.Просмотрите исходный код следующим образом:
public class Student1 {
private String name;
private int age;
private String title;
@ConstructorProperties({"name", "age", "title"})
Student1(String name, int age, String title) {
this.name = name;
this.age = age;
this.title = title;
}
public static Student1.Student1Builder builder() {
return new Student1.Student1Builder();
}
public static class Student1Builder {
private String name;
private int age;
private String title;
Student1Builder() {
}
public Student1.Student1Builder name(String name) {
this.name = name;
return this;
}
public Student1.Student1Builder age(int age) {
this.age = age;
return this;
}
public Student1.Student1Builder title(String title) {
this.title = title;
return this;
}
public Student1 build() {
return new Student1(this.name, this.age, this.title);
}
public String toString() {
return "Student1.Student1Builder(name=" + this.name + ", age=" + this.age + ", title=" + this.title + ")";
}
}
}
Как видите, код Builder точно такой же, как мы писали выше, отличие всего класса в том,Student1
класс предоставляетtoBuilder()
метод, который возвращаетStudent1Builder
Пользователь может полностью щититьBuilder
Осведомленность класса.
Ниже перечислены некоторые часто используемые аннотации ломбока и кратко описаны их функции.
Если вы хотите увидеть полную версию, вы можете перейтиОфициальный сайт.
@Getter/@Setter
Может применяться к классам и свойствам Автоматически генерировать методы get/set.
@toString
Создано автоматическиtoString
метод.
@EqualsAndHashCode
генерироватьequals
иhashcode
метод.
@RequiredArgsConstructor
Создайте конструктор с необходимыми параметрами.
Data
сокращенный метод, эквивалентный@Getter
+ @Setter
+ toString
+ EqualsAndHashCode
+ RequiredArgsConstructor
.
@AllArgsConstructor и @NoArgsConstructor
Автоматически генерировать конструктор со всеми параметрами и нулевыми параметрами.
@Log
Содержит ряд общих аннотаций системы журналов, таких как@Slf4j
,@Log4j2
И т. Д. Глобальный конечный регистратор автоматически сгенерирован для использования.
Ссылка на ссылку
проект Lombok.org/features/ali…
Заканчивать.
ChangeLog
2019-04-21 ЗавершеноВсе вышеизложенное является личными мыслями, если есть какие-либо ошибки, пожалуйста, исправьте их в комментариях.
Добро пожаловать на перепечатку, пожалуйста, подпишите и сохраните исходную ссылку.
Контактный адрес электронной почты: huyanshi2580@gmail.com
Дополнительные заметки об обучении см. в личном блоге ------>Хуян тен