Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >公司来了个新同事不会用 Lombok,还说我代码有问题!

公司来了个新同事不会用 Lombok,还说我代码有问题!

作者头像
Java_老男孩
发布于 2020-07-01 10:33:44
发布于 2020-07-01 10:33:44
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

背景

最近公司新来一个搞 Java 的同事,搞了半天项目还没有跑起来,后来叫我过去帮他看一下,然后指着红色的编译错误和我说是不是代码有问题。。

我顿时就心想,这人是不是太水了啊,工作三年了,简单的编译问题都搞不定?但是当我认真看了错误之后,发现……他竟然没装 Lombok 插件……

然后我和他说出了问题所在,让他安装下 Lombok 插件再重新编译下,他居然和我说不知道什么插件,感觉他没用过吧,甚至都没有听说过。

好吧,我认了,我默默亲自为他把 Lombok 装上了!

如果你没用过,我也不觉得奇怪,Lombok 毕竟是团队工具,但如果你也没听过,那就感觉获取新知识自我提升学习的能力有点弱了。

放弃 Lombok?

因为,最近,小编也有看到一些博主在发放弃 Lombok 的文章,再结合最近一个新同事的情况,也谈谈到底要不要用 Lombok

一味地劲大家放弃,我感觉有点偏激了,任何事物,存在就即合理,关键是利弊权衡的问题罢了。

用不用 Lombok,又是分两派,公说公有理,婆说婆有理,仁者见仁,智者见智,谁也说服不了谁,类似 EclipseIntelliJ IDEA 谁更好用之争!

我想说,争这些没任何意义,这完全取决于团队的决策,取决于你的团队能不能 Hold 住这个东西,如果利 > 弊,用它就对了,如果弊 > 利,那就考虑放弃吧。

如果你是个人项目,请大胆用吧!

Lombok 的弊端

Lombok 的好处就不说了,就是帮我们大量简化代码,这里重点说下为什么有人不推荐使用 Lombok

一、需要额外的组件

使用 Lombok 需要两个必要的组件:

1)Lombok 依赖包

使用 Lombok 的注解,就必须引用它的依赖,最后编译成最终的 class 类,如 Maven 依赖示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

这个不会引起问题,因为它是代码的一部分,而且在项目一开始的时候就引入进去了。

2)Lombok IDE 插件

Eclipse/ IntelliJ IDEA 都提供了 Lombok 插件,用来识别 Lombok 的注解,否则会显示编译报错。

IntelliJ IDEA 插件示例:

如果某一个人为了方便自己而使用,其他人不愿意使用或者被迫使用,将导致团队其他成员代码没法正常编译,这也是问题的关键所在。

还有就是文章之前说的,来了一个新同事,如果他没有相应的使用经验,就需要额外的指导,对于老员工来说无疑也是一个额外的工作量。

二、@Data 注解的坑

@Data 注解用在类上,等同于下面这几个注解合集:

  • @Getter
  • @Setter
  • @RequiredArgsConstructor
  • @ToString
  • @EqualsAndHashCode

@Getter, @Setter, @ToString 很简单,用起来也没问题,而 @RequiredArgsConstructor@EqualsAndHashCode 需要注意下。

1)RequiredArgsConstructor

Generates a constructor with required arguments.Required arguments are final fields and fields with constraints such as {@code @NonNull}.

即生成一个类构造器,参数包含所有用 final 修饰、以及 @NonNull 注解修饰的变量。

如果参数很多,都在一个构造器里面,一、极不优雅,可读性很差,二、不良设计。

与这个注解相关的还有 AllArgsConstructor 注解,包括所有参数,还是小心为妙。但在参数不多的时候还是可以代替使用的,但对不熟悉的人来说就是个潜在的问题。

2)@EqualsAndHashCode

Generates implementations for the {@code equals} and {@code hashCode} methods inherited by all objects, based on relevant fields.

这个注解用来生成 equalshashCode 方法,里面有一个 callSuper() 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Call on the superclass's implementations of {@code equals} and {@code hashCode} before calculating for the fields in this class.
 * <strong>default: false</strong>
 * 
 * @return Whether to call the superclass's {@code equals} implementation as part of the generated equals algorithm.
 */
boolean callSuper() default false;

是否调用父类的 equalshashCode 方法,默认为:false 不调用,这也是引起问题的关键。

来看下面的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class BaseStudent {

    private int id;

}

@Data
@AllArgsConstructor
public class Student extends BaseStudent {

    private String name;

    private int age;

    private String address;

}

把生成的 equalshashCode 方法反编译出来看下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean equals(Object o) {
    if (o == this)
      return true; 
    if (!(o instanceof Student))
      return false; 
    Student other = (Student)o;
    if (!other.canEqual(this))
      return false; 
    Object this$name = getName(), other$name = other.getName();
    if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
      return false; 
    if (getAge() != other.getAge())
      return false; 
    Object this$address = getAddress(), other$address = other.getAddress();
    return !((this$address == null) ? (other$address != null) : !this$address.equals(other$address));
}

public int hashCode() {
    int PRIME = 59;
    result = 1;
    Object $name = getName();
    result = result * 59 + (($name == null) ? 43 : $name.hashCode());
    result = result * 59 + getAge();
    Object $address = getAddress();
    return result * 59 + (($address == null) ? 43 : $address.hashCode());
}

最后判断如果不是同一个对象时,会判断每个变量的值,但是此时父类的值不参与比较,这显然是不符合逻辑的,另外 hashCode 方法父类的值也没有参与运算,也是潜在问题。

三、代码跟踪调试

使用 Lombok 可以帮助我们少写很多代码,但同时也降低了代码可读性和跟踪、调试的问题。

比如,我想查找 getName() 方法都被哪些地方引用了,就不能直接按快捷键了,可能需要费一翻力气。

代码调试也有问题,比如我跟进 getAddress 方法,虽然进不去该方法,但可以直接跳到对应的变量,显示对应的值。

但是我想调试生成后的 hashCode 方法的运算过程,代码没有,断点都没法打,怎么调试?

即使如此,我觉得这个问题不大,我们很少去跟踪这些代码,我们也可以通过其他方式来曲线解决。

总结

以上一些问题都是使用 Lombok 不可避免的,这还只是已知的问题,未知的呢?

Lombok 虽好,你也要遵循团队的规范,能用的情况下再用,也不能乱用,不了解其构造,乱用就容易出现问题的。

最好的方法是,作用域最小化,需要什么就用什么,注解单独使用,而不是三七二十一什么类上来都来一个 @Data 什么的,出问题就欲哭无泪了。

所有种种潜在的问题都是领导者不愿意看到的,所以,有的公司是明令禁止使用 Lombok 的,我个人是不站边,适度运用就好,但不要过度依赖。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Lombok介绍、使用方法和总结
1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code. 大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。 2 Lombok使用方法 Lombok能以简单的注解形式来简化java代码,提高开发人员的开发
猿人谷
2018/03/28
1.6K0
Lombok介绍、使用方法和总结
lombok使用基础教程
前言 lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。在很多工具类的项目中都有这个功能。比如dagger。 通俗的说,lombok可以通过注解来标示生成getter settter等代码。我们自然可以通过编译器比如IDEA的Generate生成,为啥要用这个? 在项目开发阶段,一个class的属性是一直变化的,今天可能增加一个字段,明天可能删除一个字段。每次变化都需要修改对应的模板代码。另外,有的class的字段超级多,多到一眼看不完。如果加上模板代码,更难一眼看出来。更有甚者,由于字
Ryan-Miao
2018/03/14
1.7K0
lombok使用基础教程
lombok在java项目中的使用
@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor
jinjunzhu
2020/08/20
6580
Lombok中关于@Data的使用
当你在使用 Lombok 的 @Data 注解时,其实会有一些坑需要关注,今天就让我们来见识一下。
健程之道
2019/11/03
6860
超级全面的 Lombok 注解介绍,学一波!
blog.csdn.net/riemann_/article/details/105374987
全栈程序员站长
2021/06/29
5.1K0
lombok优缺点
最近上网查资料发现很多人对lombok褒贬不一,引起了我的兴趣,因为我们项目中也在大量使用lombok,大家不同的观点让我也困惑了几天,今天结合我实际的项目经验,说说我的个人建议。
崔笑颜
2020/12/29
2.1K0
Lombok 安装及使用指南
为了减少写一些 get/set/toString 方法,让项目代码更加整洁,提高开发效率,发现大家都开始采用 Lombok 这个工具。Lombok 是一个 Java 类库,它会自动插入编辑器和构建工具,用于帮助开发人员消除 Java 中冗长样板代码。而我们开发人员所要做的,仅仅是添加几个 Lombok 中的注解,就可以替换掉原来的多行 get/set/toString 方法代码,既简洁也易于维护。下面我们就来看看,如何安装并使用这一工具。
村雨遥
2021/09/16
9960
Lombok 安装及使用指南
今天 1024,为了不 996,Lombok 用起来以及避坑指南
Lombok 项目是一个 Java 库,它会自动插入编辑器和构建工具中,Lombok 提供了一组有用的注解,用来消除 Java 类中的大量样板代码。
双鬼带单
2020/10/29
7960
这些极简的注解你都清楚吗
lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter、Setter,还能自动生成 logger、ToString、HashCode、Builder 等 java 特色的函数或是符合设计模式的函数,能够让你 java Bean 更简洁,更美观。lombok 的思想非常先进,它让我们省略繁琐的样板代码,不要在重复的代码上花费太长时间,它也是Java语言演进过程中必然出现的一种思想,要用20% 的时间做 80%的事情。下面就来看一下 lombok 的具体用法。
cxuan
2019/08/02
1.5K0
为什么有的团队严禁使用Lombok?
Java,作为一款非常热门的编程语言,尽管它有着非常丰富的语言特性,完全面向对象编程,编程高度规范化,但是也有一个最受大家诟病的一个缺点:啰嗦,尤其是当你开发了很多年之后,你会明显的感受到,相比动态语言,java 定义变量之前,要先创建类,然后定义变量类型,每个类要写很多的get/set/toString/hashCode/equals等等方法。
Java极客技术
2022/12/02
5690
为什么有的团队严禁使用Lombok?
Lombok详解
1. Lombok简介 官网地址:https://projectlombok.org/ Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为你优化Java代码。 所以可以不用再手写一个getter、setter或equals方法。 2. 变量使用介绍 2.1 val修饰变量 可以使用val作为局部变量声明的类型,而不用实际编写该类型。 当您执行此操作时,将从初始值设定项表达式中推断出类型。 局部变量也将成为final类型的变量。 此功能仅适用于局部变量和foreach循环,不适用于字
牧晗
2020/06/05
1.3K0
Lombok详解
带你快速入门 Java开发神器 lombok
在写JavaBean对象时候 每次都要重复Alt+insert写Getter/Setter toString 有参构造 和 无参构造 特别麻烦 浪费时间 今天给大家推荐神器lombok 官方支持的神器 可以帮您省去大量时间 让代码简洁易读
陶然同学
2023/02/27
2610
带你快速入门 Java开发神器 lombok
Java使用Lombok详解
Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如 hashCode() 和 equals() 、getter / setter 这样的方法以及以往用来分类各种 accessor 和 mutator 的大量时间。
鱼找水需要时间
2023/03/28
7980
Lombok快速入门
为什么说Lombok可以使代码更简洁、可以消除冗长代码呢?我们来拿lombok官网的一个例子来说:
端碗吹水
2020/09/23
1.1K0
Lombok快速入门
CTO:不要在代码中写 set/get 方法了,逮一次罚款...
刚开始学习 Java 语言的时候,面向对象的三大特征就是封装,继承,和多态。在 Java 中,要保证封装性,需要将成员变量私有化,对外提供 set/get 方法来访问,虽然现在的 IDE,像 eclipse,IDEA都提供了快捷键,来生成 set/get 方法,但是在做项目的时候,一个 JavaBean 往往会有很多的成员变量,一个变量对应两个方法,如果有10几个成员变量,那么会对应20多个方法,也许还要去写构造器、equals 等方法,而且需要维护。这样一来,会使代码变得非常冗余,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
开发者技术前线
2020/11/23
5570
CTO:不要在代码中写 set/get 方法了,逮一次罚款...
lombok让你提高代码整洁度的神器附教程及原理分析
在Java编程的过程中,我们在Code Entity的时候通常使用 IDE的generator来生成 get set toSting equals hashcode Constructor 等方法,有了lombok以后就不会了,它会在编译的过程中,分析AST抽象语法树的方式,把这些方法插入到编译以后的代码当中,这样做的好处可以降低代码量,让代码变得更容易读 程序源码 @Data public class User { int id; String name; } 编译后的代码 public
Albert陈凯
2018/04/03
7360
【侠客行】Lombok深度解析
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
大蕉
2019/09/23
6480
【侠客行】Lombok深度解析
子类使用lombok 的 @Builder 注解的正确姿势
在实际开发中,有时候需要对子类使用lombok的 @Builder注解来使用builder模式构造该子类对象。
明明如月学长
2021/08/31
2.3K0
子类使用lombok 的 @Builder 注解的正确姿势
Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
Lombok是一款Java代码功能增强库,在Github上已有9.8k+Star。它会自动集成到你的编辑器和构建工具中,从而使你的Java代码更加生动有趣。通过Lombok的注解,你可以不用再写getter、setter、equals等方法,Lombok将在编译时为你自动生成。
macrozheng
2021/01/06
9570
Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
Lombok 使用小结
Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lo
静默虚空
2018/01/05
7270
相关推荐
Lombok介绍、使用方法和总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验