lombok @Builder的介绍及使用以及lombok其它一些注解

1、重叠构造函数的优化

假设某个类,现在有3个必选属性,有5个可选属性(为了代码简洁,后面都只写一个必选属性,2个可选属性,懂就行)

那么现在想提供完善的创建该类的机制,该怎么办呢?

1、首先是方法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参数的构造方法,鬼知道应该按照什么顺序传入啊),你根本不知道该怎么用…

2、那么还有第二种方法:javabean,即使用setter.

对每个属性都提供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");

这样子的好处是可读性好,但是不好的地方是不安全,你根本不知道客户端会以什么奇怪的方式使用你的类.

3、可以使用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都会有必选参数.
  • 对所有的可选参数提供同名方法,使得可选参数可以被设置,同时返回自身.
  • Builder提供build方法,调用Student私有的构造方法,返回对象. 客户端的调用方法如下:
public static void main(String[] args) {
    Student s = new Builder("huyan").age(11).title("888").build();
}

使用Builder模式实现了上面其他两种方式的优点:安全且可读性高.

  • 限制了参数,保证必选参数肯定有.
  • 可读性好,传入每个可选参数单独调用方法,可以明确的知道每个参数的意义.
  • 链式调用看起来好看.

当然,builder模式也有缺点:

  • 在创建的过程中多创建了一个对象,这对性能肯定是有影响的,所以在极限要求性能的场景可以注意一下.
  • 代码比重叠构造器的代码都多…写起来也挺累啊.

等等,老是写Builder类?lombok了解一下,只需要一个注解就可以实现上面这样子的效果噢~

2、lombok

lombok是一套小工具,可以帮助你减少样板式或者实现一些别的功能.

简单来说,lombok的主要作用是通过一些注解,可以消除简单的 Java 对象(POJO)的Getter、Setter等样板式代码.

可以看一个 jpa + lombok 配合使用的实例:

@Entity
@Table(name = "T_MENU")
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Coffee implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @Column
    @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmount",
            parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
    private Money price;
    @Column(updatable = false)
    @CreationTimestamp
    private Date createTime;
    @UpdateTimestamp
    private Date updateTime;
}

下面列举一些常用的lombok的注解,并简要解释其作用.

  • @Getter/@Setter 可以应用在类上,属性上. 自动生成get/set方法.
  • @toString 自动生成toString方法.
  • @EqualsAndHashCode 生成equals和hashcode方法.
  • @RequiredArgsConstructor 生成一个必须参数的构造器.
  • @Data 快捷方法,相当于@Getter+ @Setter+ toString + EqualsAndHashCode + RequiredArgsConstructor.
  • @AllArgsConstructor 和 @NoArgsConstructor 自动生成全部参数和零个参数的构造方法.
  • @Log 包含一系列常用的log系统的注解,比如@Slf4j,@Log4j2等,自动生成一个全局final的logger供你使用.

如果要需了解 jpa是什么,可以参考这篇博客:
https://blog.csdn.net/qq_36610426/article/details/100736923

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值