还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了

Builder 使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。基础使用@Bui

大家好,感谢邀请,今天来为大家分享一下还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

Student.builder() .sno( ‘001’ ) .sname( ‘admin’ ) .sage( 18 ) .sphone( ‘110’ ) .build();@Builder 可以放在类、构造函数或方法上。尽管将其放置在类上和将其放置在构造函数上的两种模式是最常见的用例,但@Builder 最容易通过将其放置在方法上的用例来解释。

那么@Builder内部帮我们做了什么?

创建一个名为ThisClassBuilder 的内部静态类,并具有与实体类相同的属性(称为构建器)。在构建器中:对于目标类中的所有属性和未初始化的最终字段,将在构建器中创建相应的属性。在构建器中:创建一个不带参数的默认构造函数。在构建器中:对于实体类中的每个参数,都会创建一个类似setter的方法,只不过方法名称与参数名称相同。返回值是构建器本身(为了方便链接),如上面的示例所示。 builder中:有一个build()方法,调用该方法会根据设置的值创建一个实体对象。在构建器中:还会生成一个toString() 方法。在实体类中:会创建一个builder()方法,其目的是创建一个builder。说了这么多,我们通过下面的例子来理解一下

@Builderpublic class User { private Final Integer code=200;私有字符串用户名; private String password;} //编译后: public class User { private String username;私有字符串密码; User(字符串用户名, 字符串密码) { this.username=用户名; this.password=密码; } public static User.UserBuilder builder() { return new User.UserBuilder(); } 公共静态类UserBuilder { 私有字符串用户名;私有字符串密码; UserBuilder() {} public User.UserBuilder 用户名(String username) { this.username=用户名;返回这个; } public User.UserBuilder 密码(字符串密码){ this.password=密码;返回这个; } public User build() { return new User(this.username, this.password); } public String toString() { return ‘User.UserBuilder(用户名=’ + this.username + ‘, 密码=’ + this.password + ‘)’; } }}

组合用法

用于@Builder @Singular 注解集合

当使用@Singular注解(使用@Builder注解的类)来注解集合字段时,lombok会将构建器节点视为集合并生成两个adder方法而不是setter方法。

将单个元素添加到集合中的方法和将另一个集合的所有元素添加到集合中的方法不会生成仅设置集合的setter(替换已添加的任何内容)。还生成了一个清晰的方法。这些奇异构建器相对复杂,主要保证以下特性:

当调用build() 时,生成的集合将是不可变的。调用build() 后调用adder 或clear 方法之一不会修改任何已生成的对象。如果集合修改后再次调用build(),则会创建一个基于前一个对象的对象实体。生成的集合将被压缩为最小的可行格式,同时保持高效。 @Singular 只能应用于lombok 已知的集合类型。目前,支持的类型有:

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了

java.util:

Iterable、Collection 和List(通常由压缩的、不可修改的ArrayList 支持)。Set、SortedSet 和NavigableSet(通常生成为可变大小的、不可修改的HashSet 或TreeSet)。Map、SortedMap 和NavigableMap(通常生成大小可变且无法修改的HashMap 或TreeMap)。 Guava 的com.google.common.collect:ImmutableCollection 和ImmutableListImmutableSet 和ImmutableSortedSetImmutableMap、ImmutableBiMap 和ImmutableSortedMapImmutableTable 第一种,当集合中没有元素时,创建一个空间列表。在第二种情况下,当集合中存在元素时,将创建一个不可变的单元素列表。第三种情况,根据当前集合中的元素数量创建适当大小的列表。当然,我们看一下编译后的代码,创建了三个关于Collection操作的方法:

hobby(String hobby):向集合添加一个元素hobbies(Collection? extends String hobbies):添加集合的所有元素clearHobbies():清除当前集合数据@Singular注解配置value属性

我们先来看看@Singular注解的细节:

@Target({FIELD, PARAMETER})@Retention(SOURCE)public @interface Singular { //修改添加集合元素的方法名String value() default ”;} 测试如何使用注解属性值

@Builderpublic class User { private Final Integer id;私有最终字符串zipCode=’123456′;私有字符串用户名;私有字符串密码; @Singular(value \=’testHobbies’) private ListString hobbies;} //测试类public class BuilderTest { public static void main(String\[\] args) { User user \=User.builder() .testHobbies(‘reading ‘) .testHobbies(‘eat’) .id(1) .password(‘admin’) .username(‘admin’) .build(); System.out.println(用户);注意,当我们使用注解属性值时,我们用来添加集合元素的方法会发生相应的变化。但是,为添加整个集合而生成的方法名称是否同时更改了?我们再看一下编译后的代码:

/编译后: public class User { //省略部分代码,只看关键部分public static class UserBuilder { public User.UserBuilder testHobbies(String testHobbies) { if (this.hobbies==null) { this.hobbies=新的ArrayList(); this.hobbies.add(testHobbies);返回这个; } public User.UserBuilder hobbies(Collection? extends String hobbies) { if (this.hobbies==null) { this.hobbies=new ArrayList(); }这个.hobbies.addAll(爱好);返回这个; } public User.UserBuilder clearHobbies() { if (this.hobbies !=null) { this.hobbies.clear(); }返回这个; } }} 可以看到只有添加元素的方法名发生了变化。最新面试题已整理完毕。点击Java面试库小程序即可在线答题。

使用@Builder.Default

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了

例如有一个这样的实体类:

@Builder@ToStringpublic class User { @Builder.Default private Final String id=UUID.randomUUID().toString();私有字符串用户名;私有字符串密码; @Builder.Default private long insertTime=System.currentTimeMillis();} 在类中,我在id 和insertTime 上都添加了注解@Builder.Default。当我使用这个实体对象时,我不需要初始化这两个字段的值,如下:

public class BuilderTest { public static void main(String\[\] args) { User user \=User.builder() .password(‘admin’) .username(‘admin’) .build(); } System.out.println(用户); }}//输出内容:User(id=416219e1-bc64-43fd-b2c3-9f8dc109c2e8, username=admin,password=admin,insertTime=1546869309868) lombok在实例化对象字段值时为我们初始化了这两个。

当然,如果再次设置这两个字段,默认定义的值会被覆盖,如下:

public class BuilderTest { public static void main(String[] args) { User user=User.builder() .id(‘admin’) .password(‘admin’) .username(‘admin’) .build(); }系统.out.println(用户); }}//输出内容User(id=admin, username=admin, password=admin, insertTime=1546869642151)@Builder 详细配置

我们来仔细看看@Builder注解类的详细实现:

@Target({TYPE, METHOD, CONSTRUCTOR})@Retention(SOURCE)public @interface Builder { //如果@Builder注解在类上,可以使用@Builder.Default指定初始化表达式@Target(FIELD) @Retention(SOURCE ; 方法的名称,默认为:build (个人认为不需要修改) String buildMethodName() default ‘build’; //指定要创建的构建器类的名称,默认为:实体类名+ Builder String builderClassName() default ‘ ‘; //使用toBuilder 根据实例创建对象(即复用原始对象的值) boolean toBuilder() default false; Target({FIELD, PARAMETER}) @Retention(SOURCE) public @interface GettingVia { //告诉lombok 使用表达式来获取值String field() default ‘ ‘; //告诉lombok 使用表达式来获取值String method() default ”; boolean isStatic() default false; }}对于上面的注解属性,我只测试了一个比较常用的toBuilder,因为我们在操作实体对象时,经常会有对某个字段的二次赋值一些实体对象,这个时候就会用到这个属性。最新面试题已整理完毕。点击Java面试库小程序即可在线答题。

但是,这将创建一个新对象,而不是原始对象。原始对象属性是不可变的,除非你想给这个实体类添加@Data或者@setter方法。让我们测试一下:

用户评论

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
七级床震

我以前也是傻乎乎地手动写 Builder 模式,浪费太多时间!自从使用 Lombok 的 @Builder 后,代码简洁明了,效率直线上升,强烈推荐各位尝试一下。

    有7位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
苏樱凉

这篇文章讲得太棒了!我一直觉得 Builder 模式繁琐,Lombok的解决方案真是太方便了。这下构建对象再也不用那么费劲了,简直是编程福音啊!

    有14位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
苏莫晨

手动写 Builder 模式的确很累赘,代码量大、逻辑复杂。Lombok 的 @Builder 确实可以简化很多,提高开发效率。不过有时候我还是喜欢自己理解和控制数据的构造过程。

    有12位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
莫阑珊

lombok的builder真是个神器!以前一直是用spring自带的Builder模式,现在直接用@builder 简洁了很多。这种自动生成方法简直不要太牛逼!

    有18位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
我没有爱人i

虽然 @Builder 功能非常强大,但要注意代码的可读性和可维护性。过于依赖自动化工具有时反而会增加代码理解的复杂度。

    有19位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
又落空

lombok真是个好东西,学习它可以提高编码效率不少啊!不过这个@builder是不是只适合简单的对象构建?复杂的业务逻辑,用传统的Builder模式还是比较方便吧?

    有17位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
墨城烟柳

我也一直在用 Lombok 的 @Data 和 @Builder,确实感觉比手动写代码省时省力!这篇博客文章内容详细全面,对初学者也很友好!

    有20位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
夏以乔木

这篇文章把 Lombok 的 @Builder 用法讲解得很清楚易懂,让我终于明白了它的优势和用法。以前总是觉得 Builder 模式很麻烦,现在看来可以用 @Builder 来解决很多问题!

    有14位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
。婞褔vīp

Lombok 确实强大,@Builder 能帮我们快速构建对象,节省不少时间。但我个人更喜欢自己手工写 Builder 模式,这样可以更好地理解代码结构和数据流向。

    有14位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
你很爱吃凉皮

我之前也用过手动写的 Builder 模式,但自从使用了 Lombok 的 @Builder 后,感觉开发效率提升了不少。代码简洁易读,而且减少了繁琐的 boilerplate 代码!

    有9位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
莫飞霜

Lombok 还是不错的工具, @Builder 用起来确实方便快捷。只是需要注意它可能会让代码更依赖框架,在迁移项目的时候可能带来一些麻烦。

    有15位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
颜洛殇

我之前对 Lombok 不了解,看过这篇文章后感觉可以用 @Builder 来解决不少 Builder 模式繁琐的问题。看起来简单易用,值得一试!

    有7位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
|赤;焰﹏゛

感觉 Lombok 的 @Builder 比传统的 Builder 模式简洁很多,而且生成代码自动完成,省时省力。但是,会不会影响代码的可读性和可维护性呢?

    有16位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
箜明

这篇文章把 @Builder 用法讲得很详细,包括一些常见的使用场景和注意事项。我以前觉得写 Builder 模式很麻烦,现在看来可以使用 Lombok 直接生成!

    有6位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
゛指尖的阳光丶

虽然 Lombok 的@Builder 很强大,但是对于已经熟悉传统 Builder 模式的开发者来说,它可能会有些别扭。而且过于依赖自动化工具可能会降低代码的透明度。

    有14位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
执妄

我平时喜欢简洁明了的代码风格,Lombok 的 @Builder 刚好能满足我的需求。它可以帮助我减少冗余的代码,提高开发效率

    有9位网友表示赞同!

还在建造者模式下写作吗?尝试在Lombok中使用@Builder,它太强大了
軨倾词

这篇文章很有用,让我了解到 Lombok 的 @Builder 功能非常强大。以后有机会我会尝试在项目中使用!

    有20位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/125963.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午8:59
下一篇 2024年9月1日 下午9:05

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注