博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊lombok构造模式的参数校验
阅读量:6437 次
发布时间:2019-06-23

本文共 2614 字,大约阅读时间需要 8 分钟。

  hot3.png

本文主要聊一下在lombok的builder模式下,如何进行参数校验。

maven

org.projectlombok
lombok
1.16.16
provided

本文基于1.16.16版本来讲

lombok的builder实例

@Data@Builderpublic class DemoModel {    private String name;    private int age;    private int start;    private int end;}

这个,是个组合的注解,具体如下

/** * Generates getters for all fields, a useful toString method, and hashCode and equals implementations that check * all non-transient fields. Will also generate setters for all non-final fields, as well as a constructor. * 

* Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}. *

* Complete documentation is found at the project lombok features page for @Data. * * @see Getter * @see Setter * @see RequiredArgsConstructor * @see ToString * @see EqualsAndHashCode * @see lombok.Value */@Target(ElementType.TYPE)@Retention(RetentionPolicy.SOURCE)public @interface Data { /** * If you specify a static constructor name, then the generated constructor will be private, and * instead a static factory method is created that other classes can use to create instances. * We suggest the name: "of", like so: * *

	 *     public @Data(staticConstructor = "of") class Point { final int x, y; }	 * 
* * Default: No static constructor, instead the normal constructor is public. */ String staticConstructor() default "";}

@Builder会按builder模式生成一个内部类,具体使用如下

DemoModel model = DemoModel.builder()                .name("hello")                .age(-1)                .build();

validation

那么问题来了,如果在build方法调用,返回对象之前进行参数校验呢。理想的情况当然是lombok提供一个类似jpa的@PrePersist的钩子注解呢,可惜没有。但是还是可以通过其他途径来解决,只不过需要写点代码,不是那么便捷,多lombok研究深入的话,可以自己去扩展。

@Data@Builderpublic class DemoModel {    private String name;    private int age;    private int start;    private int end;    private void valid(){        Preconditions.checkNotNull(name,"name should not be null");        Preconditions.checkArgument(age > 0);        Preconditions.checkArgument(start < end);    }    public static class InternalBuilder extends DemoModelBuilder {        InternalBuilder() {            super();        }        @Override        public DemoModel build() {            DemoModel model = super.build();            model.valid();            return model;        }    }    public static DemoModelBuilder builder() {        return new InternalBuilder();    }}

这里通过继承lombok生成的builder(重写build()方法加入校验),重写builder()静态方法,来返回自己builder。这样就大功告成了。

小结

上面的方法还不够简洁,可以考虑深入研究lombok进行扩展,实现类似jpa的@PrePersist的钩子注解,更进一步可以加入支持jsr303的validation注解。

doc

转载于:https://my.oschina.net/go4it/blog/1557415

你可能感兴趣的文章
我收藏的技术知识图(每张都是大图)
查看>>
Spring Boot制作启动图案
查看>>
《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理
查看>>
hdu Oil Deposits
查看>>
彻底理解javascript中的this指针
查看>>
SAS去空格
查看>>
MySQL用户和权限管理
查看>>
Spring Cloud构建微服务架构(二)服务消费者
查看>>
这些老外的开源技术养活了一票国产软件
查看>>
Maven实战(六)--- dependencies与dependencyManagement的区别
查看>>
创业者应该有的5个正常心态(转)
查看>>
php模式设计之 注册树模式
查看>>
【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
查看>>
_ENV和_G
查看>>
别做操之过急的”无效将军”,做实实在在的”日拱一卒” 纵使一年不将军,不可一日不拱卒...
查看>>
Oracle Grid Infrastructure: Understanding Split-Brain Node Eviction (文档 ID 1546004.1)
查看>>
Linux改变进程优先级的nice命令
查看>>
**16.app后端如何保证通讯安全--url签名
查看>>
win32窗口机制之CreateWindow
查看>>
C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
查看>>