频繁的set和get属性使用构建者进行优化

在 Java 中,如果你发现你的类有很多 set 和 get 方法,可能是时候考虑使用 Builder 模式 来优化代码了。Builder 模式特别适合于那些有多个属性、且这些属性需要通过多个 set 方法进行赋值的对象。通过 Builder 模式,可以将对象的构建过程更加清晰、简洁,并避免频繁调用 set 和 get 方法。
Builder 模式概述
Builder 模式通过引入一个内部静态类(即 Builder),将复杂对象的构建过程分离出来。每次创建对象时,可以通过调用 Builder 类的链式方法来设置属性,最后通过调用 build() 方法来生成最终的对象。
优化步骤
假设你有一个 Person 类,有多个属性,且需要频繁使用 set 和 get 方法。
1. 普通的 set 和 get 方法
public class Person {
    private String name;
    private int age;
    private String address;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

2. 使用 Builder 模式优化
通过使用 Builder 模式,可以在创建 Person 对象时一次性设置所有属性,避免频繁使用 set 方法,同时代码更具可读性。
修改后的 Person 类:
public class Person {
    private String name;
    private int age;
    private String address;

    // Private constructor to prevent direct instantiation
    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }

    // Getters
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    // Static Builder class
    public static class Builder {
        private String name;
        private int age;
        private String address;

        // Builder methods for setting properties
        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }

        // Build method to create Person object
        public Person build() {
            return new Person(this);
        }
    }
}

3. 如何使用 Builder 创建对象
现在,通过 Builder 类来创建 Person 对象:
public class Main {
    public static void main(String[] args) {
        // 使用 Builder 模式创建 Person 对象
        Person person = new Person.Builder()
            .setName("John")
            .setAge(30)
            .setAddress("123 Main St")
            .build();

        // 获取属性
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        System.out.println("Address: " + person.getAddress());
    }
}

优点:

1.链式调用:Builder 模式允许你通过链式调用(每次调用 setXXX 方法时返回 this)来设置多个属性,这样就避免了繁琐的 set 方法调用。
2.可读性和可维护性:通过 Builder 模式,构建对象的代码更加简洁和清晰,同时每个属性的设置都明确地在一个地方完成,而不是分散在多个地方调用 set 方法。
3.防止不完整对象:由于构建者(Builder)模式通常要求调用 build() 方法来完成对象的构建,这样可以确保对象是完整的,避免出现未初始化的属性。
4.支持不可变对象:Builder 模式可以让你在创建对象时将其设置为不可变对象,通常将类的构造函数设为 private,确保只能通过 Builder 创建对象。

结论:
使用 Builder 模式可以有效优化 Java 中频繁使用 set 和 get 方法的情况。通过 Builder,你可以使对象的构建过程更简洁、可读,并且避免了频繁调用 set 方法。这个模式尤其适用于那些具有多个属性且构造器参数较多的对象。

使用 @Builder 注解和手动实现 Builder 模式的方式都有类似的效果,它们都可以简化对象的构建过程,使得对象的构建更加清晰、简洁。具体的区别在于实现方式、代码简洁性、灵活性和一些附加功能。下面是这两者的对比:
1. 代码简洁性

1.手动实现 Builder 模式:需要手动编写 Builder 类和相应的方法。这意味着需要更多的代码,尤其是在处理多个属性时,代码量会迅速增加。
2.使用 @Builder 注解:通过使用 Lombok 提供的 @Builder 注解,编译器会自动生成 Builder 类及其相关代码,显著减少了样板代码的数量。

示例对比:
手动实现 Builder 模式:
public class Person {
    private String name;
    private int age;
    private String address;

    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }

    // Getters

    public static class Builder {
        private String name;
        private int age;
        private String address;

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

使用 Lombok @Builder 注解:
import lombok.Builder;

@Builder
public class Person {
    private String name;
    private int age;
    private String address;

    // Lombok 会自动生成 Builder 类及相关代码,无需手动编写
}

通过 @Builder 注解,Lombok 自动为 Person 类生成了一个 Builder 类,以及 setName(), setAge(), setAddress() 等方法,还自动生成了 build() 方法。使用时非常简洁:
public class Main {
    public static void main(String[] args) {
        Person person = Person.builder()
                .name("John")
                .age(30)
                .address("123 Main St")
                .build();

        System.out.println(person.getName());
    }
}

2. 灵活性与定制化

  • 手动实现 Builder 模式:你可以完全控制 Builder 类的实现,可以定制 Builder 的行为。例如,可以添加检查、验证或在 build() 方法中进行复杂逻辑处理。
  • 使用 @Builder 注解:Lombok 会自动生成代码,但这种自动生成的方式比较固定,虽然可以通过 Lombok 的选项进行一定程度的定制,但不如手动实现灵活。例如,如果你想要对构建过程做特殊处理(比如属性校验),则可能需要进行额外的操作。

3. 依赖

  • 手动实现 Builder 模式:完全不依赖任何外部库,纯粹是 Java 代码实现,适用于不希望依赖外部工具或库的场景。
  • 使用 @Builder 注解:依赖 Lombok 库。Lombok 是一个非常流行的 Java 库,用于减少样板代码,但是它需要额外的依赖和构建支持。没有 Lombok 的支持,@Builder 注解会失效。

4. 额外的功能

  • 手动实现 Builder 模式:你需要手动编写所有代码,包括 build() 方法和 Builder 的所有成员。每个功能都需要你自己定义。
  • 使用 @Builder 注解:Lombok 提供了一些额外的功能,比如:
    • @Builder.Default:为 Builder 提供默认值,避免手动设置默认值。
    • @Builder(toBuilder = true):允许你生成一个可以基于已有对象创建新对象的构建器。
    • 链式调用:Lombok 会默认生成链式调用的方法,这与手动实现时需要小心返回 this 的方式相似。

5. 性能

  • 手动实现 Builder 模式:没有额外的性能开销。
  • 使用 @Builder 注解:Lombok 生成的代码是编译时生成的,不会在运行时产生额外的性能开销。因此,性能开销几乎是可以忽略的,尤其是对于大多数应用来说。

6. 可维护性

  • 手动实现 Builder 模式:如果有多个类都需要实现 Builder 模式,你可能会发现维护 Builder 类的代码会变得比较繁琐,尤其是代码量较大时。
  • 使用 @Builder 注解:Lombok 提供了非常简洁的语法,减少了重复代码,使得类的维护更加方便。

结论:

  • 使用 @Builder 注解 是一种更简洁、快速的实现方式,特别适用于不需要高度定制化的场景,且依赖 Lombok 库的项目。
  • 手动实现 Builder 模式 提供了更大的灵活性和控制,适用于需要进行复杂验证、定制化构建逻辑或不希望依赖外部库的场景。

两者都能有效简化对象的构建过程,选择哪种方式主要取决于项目的需求和对库的依赖的接受程度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值