Режим строителя, а также введение и использование ломбока

Java

Эта статья разделена на две части:

  1. Статья 2 главы 2 Эффективной книги Java遇到多个构造器参数时要考虑使用构建器Сделайте сброс.
  2. Ломбок просто реализует эту функцию, давайте изучим некоторые способы использования ломбока.

Что такое строители и почему вы должны их использовать

Предположим, у класса теперь есть 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;
    }

Здесь есть несколько важных моментов:

  1. Конструктор класса Student приватизирован, поэтому, если вы хотите создать нового Student, вы должны использовать Builder.
  2. Builder имеет только один метод построения, который передает требуемые параметры, что гарантирует, что каждый Student будет иметь требуемые параметры.
  3. Предоставляет метод с тем же именем для всех необязательных параметров, так что необязательный параметр может быть установлен при возврате самого себя.
  4. Строитель предоставляет метод сборки, который вызывает частную конструктор студента и возвращает объект.

Метод вызова клиента выглядит следующим образом:

    public static void main(String[] args) {
        Student s = new Builder("huyan").age(11).title("888").build();
    }

Использование шаблона Builder обеспечивает преимущества двух других описанных выше методов: безопасность и удобочитаемость.

  1. Параметры ограничены, и наличие требуемых параметров гарантировано.
  2. Хорошая читаемость, передайте каждый необязательный параметр и вызовите метод отдельно, вы можете четко знать значение каждого параметра.
  3. Связанные вызовы выглядят красиво.

Вау, есть ли обратная сторона такого высокомерия!

Конечно, есть:

  1. Эта производительность, безусловно, влияет на создание более чем объекта, поэтому сцена может ограничивать требования к производительности.
  2. Кода больше, чем перекрывающихся конструкторов... и писать его утомительно.

Подождите, вы всегда пишете класс 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

Дополнительные заметки об обучении см. в личном блоге ------>Хуян тен