关于Lombok的注解

我们知道java1.8出了很多新特性,可以让我们的开发代码变得骚(优)气(雅)蓬(简)勃(洁)起来,比如说我们现在已经熟知的lombalabala表达式和stream流


图片 1.png
比如说lombalabala表达式的基础语法 小箭头 “->”,将其分为参数列表(左侧)和执行函数体两部分,即使得代码简洁不少,也提高了代码的可读性。

当然还有其他方面的一些改进,
比如说我们新建一个对象类,搞一大堆字段
图片 2.png

一般来讲我们需要写一些构造方法,geter,seter,toString,hashcode什么的方法,虽然编译器给我们提供了特别方便的 alt+insert 快速构建方法,但是呢,我们快速的创建好这一套流程下来 我们的entity文件变成了什么呢?


image.png

是的,它变成了一米七的糙汉子。。。
为了让我们的类一直保持mini可爱,我们引入了lombok的注解@Data


image.png

一个注解解决一切难题


image.png

从官方文档上可以看出@Data 注解其实是一个全家桶套餐,其中包含了@ToString,@EqualsAndHashCode和@Getter/@Setter以及 @RequiredArgsConstructor
所以才如此强大,一个注解就省了我们一百多行代码。

正所谓优秀的工具也要正确的使用,一些时候因为我们犯的错误也会造成一些有趣的bug,下面我简单举个栗子:
image.png
这是我的一个父类
image.png

这是我的一个继承类


image.png

下面我们猜测一下 最终输出的是false呢还是ture呢?


image.png

答案是


image.png

为啥我的mate20和P30竟然是一样的呢!!
这就是@Data注解的一个小心机啦,我们知道上面说它集合了@EqualsAndHashCode这个注解,在官网中对这个注解做了说明:官网全是英文,我吃力的点了翻译一下


image.png

大概意思是说,此注解会生成equals(Object other) 和 hashCode()方法,但是如果是应用到扩展类上的时候,问题就会棘手起来,因为它默认只使用该类中定义的属性且不调用父类的方法。但是我们可以用callSuper=true来解决这种问题,来显示的告诉代码我要调用父类的方法。
我们试一下:


image.png
image.png

现在是false啦!
那么为什么要有这种默认不考虑父类的设定呢?
当我再次尝试的时候发生了一点现象可能会给我一些启发:


image.png

因为再往上追寻父类就是Object啦!跟Object爸爸谈条件是没有意义的…

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容