@Builder使用技巧

作者: 老鼠AI大米_Java全栈 | 来源:发表于2023-02-06 14:17 被阅读0次

简述:Builder 使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。
使用:一般单独进行使用,如果需要和@Data一起使用,为避免造成不必要错误。推荐下面四个注解一起使用。

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor

简单使用:

注意:对于目标类中的所有的属性和未初始化的final字段,才会在构建器中创建对应属性。(所以下面没有.code()赋值)

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private final Integer code = 200;
    private String username;
    private String password;
}

System.out.println(User.builder().username("hecc").password("hecc").build());

image

泛型使用:

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User<T> {
    private final Integer code = 200;
    private String username;
    private String password;
    private List<T> roles;
}

System.out.println(User.<String>builder().username("hecc").password("hecc").role(Lists.newArrayList("admin")).build());

image

@Builder中使用 @Singular 注释集合

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private final Integer code = 200;
    private String username;
    private String password;
    @Singular
    private List<String> roles;
}

//不添加
System.out.println(User.builder().username("hecc").password("hecc").build());
//单个添加
System.out.println(User.builder().username("hecc").password("hecc").role("admin").build());
//多次单个添加
System.out.println(User.builder().username("hecc").password("hecc").role("admin").role("read").build());
//一次性添加多个
System.out.println(User.builder().username("hecc").password("hecc").roles(Lists.newArrayList("admin","read")).build());
//搭配使用
System.out.println(User.builder().username("hecc").password("hecc").role("test").roles(Lists.newArrayList("admin","read")).build());
//还有个clearRoles()可以清空List集合里面的数值。

image

注意:
@Singular注解添加的额外方法使用的是集合名的单数形式。
例如:childrenInfos会生成childrenInfo;glasses会生成glass;children会生成child。
有时候属性名不规范或者无法识别时,@Singular就不知道生成啥样的,这个时候编译就报错,提示你:

Can’t singularize this name: “ssss”; please specify the singular explicitly (i.e. @Singular(“sheep”))

解决办法:
1.规范命名,采用复数,比如roles。
2.@Singular(value="XXX"),给单个添加取个别名,这样你取的XXX就是单个添加的,被注解修饰的就是集合形式添加的。

@Singular注解的value属性,可以更改调用的方法名,如:

@Singular(value = "test")
private List<String> roles;

这样就是用.test("admin")赋值了,但是注意:添加一个集合的方法名没有发生改变,还是.roles(List集合)

        System.out.println(User.builder().username("hecc").password("hecc").test("admin").roles(Lists.newArrayList("test")).build());

image

@Builder.Default 的使用

在类中我在id和insertTime上都添加注解@Builder.Default,当我在使用这个实体对象时,我就不需要在为这两个字段进行初始化值。如果赋值,就会覆盖原有的赋值。

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private final Integer code = 200;
    private String username;
    private String password;
    @Singular(value = "test")
    private List<String> roles;
    @Builder.Default
    private String id = UUID.randomUUID().toString();
    @Builder.Default
    private long insertTime = System.currentTimeMillis();
}

System.out.println(User.builder().username("hecc").password("hecc").test("admin").build());
System.out.println(User.builder().username("hecc").password("hecc").test("admin").id("admin").insertTime(123).build());

image

相关文章

  • @Builder使用技巧

    简述:Builder 使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节...

  • OKHttp 源码分析

    基本使用 异步GET Request.Builder builder = new Request.Builder(...

  • OkHttp网络请求原理流程解析

    1.OkHttpClientOkHttpClient.Builder()使用builder模式,用户可以自定义相应...

  • 效率提升办法

    1、实体构造,使用@Builder注解,但要注意踩坑@Builder@AllArgsConstructor@NoA...

  • Android设计模式之(2)----Builder模式

    Builder模式 Builder模式使用链式结构创建复杂对象,将过程与结果分开,创建过程中可以自行组合。 使用场...

  • lombok使用

    @AllArgsConstructor @Builder使用案例 @EqualsAndHashCode @Data...

  • builder简单例子

    builder模式是 builder负责产生组件, 然后使用director进行组装。实现复杂对象的构建 与 它...

  • Builder建造者模式

    使用Builder内部内,set方法返回this.

  • QGIS: create plugin with plugin

    用plugin builder初始化plugin1,使用plugin builder,按要求填写资料2,在OSGe...

  • Effective Java

    一、 静态工厂方法 二、 创建对象的时候使用Builder Builder 方式创建的对象,在调用 build()...

网友评论

    本文标题:@Builder使用技巧

    本文链接:https://www.haomeiwen.com/subject/uxstkdtx.html