使用Lombok和建造者模式简化代码

在项目开发中,我们经常需要构建对象。常见的做法有getter/setter,或者构造器构建对象。
可能会有人写出类似如下的代码:

Company company=new Company();
company.setAgentId(agentId);
company.setAgentUserId(agentUserId);
company.setCompanyName( companyName );
company.setAgentUserName(agentUserName);
company.setDomain( domain );
company.setTaxNo( taxNo );
company.setCreateTime( new Date() );
company.setIsauth(1);
company.setActivationCode(activationCode);
company.setAuthCode(authCode);
company.setDomain(domain);
company.setUseType(1);
company.setContactor(phoneNumber);

也可能写了一个参数非常冗长,传参特别容易出错的构造方法。

Lombok注解

我们可以使用Lombok和建造者模式简化代码。
(注意,Lombok除了要加入依赖包,还需要配置一下。几分钟可以搞定,具体做法参考以下。)
https://blog.csdn.net/Nicholas_GUB/article/details/120929648
如果你的同事不喜欢用Lombok,或者你想了解一下Lombok注解所表示的代码块,你可以在安装插件后,通过选择IDEA导航栏的"Refactor"—"Delombok"将Lombok注解逆向生成代码。
首先,在Company类上方加入Lombok注解,如下所示:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "getCompany")
public class Company {
    private Integer agentUserId;
    @NonNull
    private Integer agentId;
    private String companyName;
    private String agentUserName;
    private String domain;
    private String taxNo;
    private Date createTime;
    private Integer isAuth;
    private String activationCode;
    private String authCode;
    private Integer userType;
    private String phoneNumber;
}

其中的注释意思如下:

@Getter:表示各个属性的get()方法。
@Setter:表示各个属性的set()方法。
@Builder:可通过Builder模式构建对象。
@NonNull:变量不能为空
@ToString: 表示toString()方法。
@EqualsAndHashCode:表示equals()、hashcode()方法。
@ToString(exclude = {"authCode"}):表示toString()方法中,不计入authCode这个属性变量
@EqualsAndHashCode(of = {"authCode"}):表示equals和计算hasCode时,不计入authCode这个属性变量。
@EqualsAndHashCode(callSuper = false):表示equals和计算hasCode时,不会比较其继承的父类的属性,可能会导致错误判断,谨慎使用 callSuper = false;
@EqualsAndHashCode(callSuper = true):表示equals和计算hasCode时,会比较其继承的父类的属性;
@Data:包含了getter、setter、toString、equals、hashcode方法。
@NoArgsConstructor : 生成一个无参数的构造方法。
@AllArgsContructor: 会生成一个包含所有变量的构造方法。
@RequiredArgsConstructor: 会生成一个包含常量,和标识了NotNull的变量 的构造方法。
@RequiredArgsConstructor(staticName = "getCompany"):生成的构造方法是private,外部可以使用static方法访问。

其他的:

* @Accessors(chain = true) ,该注解设置为chain=true,可以用链式访问,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。
 //开起chain=true后可以使用链式的set
 Person person=new Person().setAge(27).setName("kevin");
* @EqualsAndHashCode 标在子类上。。
  1. callSuper = true,根据子类自身的字段值和从父类继承的字段值 来生成hashcode,当两个子类对象比较时,只有子类对象的本身的字段值和继承父类的字段值都相同,equals方法的返回值是true。
  2. callSuper = false,根据子类自身的字段值 来生成hashcode, 当两个子类对象比较时,只有子类对象的本身的字段值相同,父类字段值可以不同,equals方法的返回值是true。

如果不理解,我们可以选择IDEA导航栏的"Refactor"—"Delombok"逆向生成代码。
只加注解@RequiredArgsConstructor表示的代码如下,由于只有变量agentId为@NonNull,所以构造方法只有这个变量:

    public Company(Integer agentId) {
        this.agentId = agentId;
    }

使用注解@RequiredArgsConstructor(staticName = “getCompany”)表示的代码如下:

    private Company() {
    }

    public static Company getCompany() {
        return new Company();
    }

Builder模式构建对象

加入了@Builder后,那么可以将代码改写成如下:

   Company company=Company.builder().agentId(1).agentUserId(1).companyName("google")
                                  .agentUserName("lin").domain("test").taxNo("1111111")
                                  .createTime(new Date()).isAuth(1).activationCode("0587-1235")
                                  .userType(1).phoneNumber("666666666")
                                 .build();

基本形式就是: 类名.builder().build() ,在中间加入变量方法及变量的具体值。
通过这种方式构建对象,没有那么多的setter,参数也不容易出错。

参考资料:
http://kriszhang.com/lombok/

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lombok是一个Java库,它提供了一些注解,可以简化Java代码的编写。其中之一就是建造者模式(Builder pattern)。 使用Lombok建造者模式可以方便地创建不可变对象,并且避免了手动编写大量的构造方法和setter方法。通过在类上添加`@Builder`注解,Lombok会自动生成一个内部静态类,该类包含了所有属性的setter方法,并且还提供了一个名为`build()`的方法用于构建对象。 下面是使用Lombok建造者模式的一个简单示例: ```java import lombok.Builder; import lombok.Getter; @Builder @Getter public class Person { private final String name; private final int age; private final String address; } 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()); // 输出:John System.out.println(person.getAge()); // 输出:30 System.out.println(person.getAddress()); // 输出:123 Main St } } ``` 在上面的示例中,我们使用`@Builder`注解在`Person`类上,然后通过调用自动生成的`builder()`方法来创建一个建造者对象。接着,我们可以使用链式调用来设置属性的值,并最后调用`build()`方法来构建不可变的`Person`对象。 需要注意的是,我们在`Person`类中的属性前添加了`final`关键字,这是为了确保对象的不可变性。此外,Lombok还会自动生成`equals()`、`hashCode()`和`toString()`等方法,以及一个私有的全参构造方法。 通过使用Lombok建造者模式,我们可以简化代码并且提高可读性,特别是在创建拥有大量属性的对象时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值