资讯专栏INFORMATION COLUMN

使用神器Lombok优雅编码

_ang / 3428人阅读

摘要:提高编码效率使代码更简洁消除冗长代码避免修改字段名字时忘记修改方法名提高下逼格以上就是的优点,当然,的优点远远不止以上几点,使用,你可以更加优雅高效的编辑代码。实战完成了上述准备之后,就可以愉快的使用进行编码了。接下来是使用简化后的代码。

Lombok介绍

近来偶遇一款撸码神器,介绍给大家~
相信许多小伙伴都深有体会,POJO类中的千篇一律的getter/setter,constructor等方法让人写的揪心,那么今天就有一种方法可以残暴的解决这个问题。
接下来为大家介绍这款神器:Lombok
以下是官方对Lombok的介绍

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Project Lombok是一个java库,它可以自动插入编辑器和构建工具,为java增色。永远不要再编写另一个getter或equals方法,使用一个注释,您的类就有了一个功能齐全的构建器、自动记录变量等等。

简而言之,Lombok实现的效果就是通过简单的注解来精简代码达到消除冗长代码的目的

Lombok优点及缺点

对Lombok有了一个基本的认识之后,让我们来挖掘一下它的优缺点。首先看一下它的优点。

提高编码效率

使代码更简洁

消除冗长代码

避免修改字段名字时忘记修改方法名

提高下逼格

以上就是Lombok的优点,当然,Lombok的优点远远不止以上几点,使用Lombok,你可以更加优雅高效的编辑代码。但,俗话说“有利必有弊”,Lombok为我们带来便利的同时也带来的不少小麻烦。

Lombok需要额外的环境配置(接下来为讲到)

传染性(一旦在resource包里用了lombok,别人想看源码也不得不装插件)

降低代码可读性

虽然Lombok有着不少缺点,但总归是利大于弊,作为一款优秀的神器,仍然值得我们去学习。

Lombok原理

授人以鱼不如授人以渔,接下来简要介绍一下Lombok的原理。

Sun公司在2005.2.1提交了JSR 269,用于支持在编译期对annotation进行处理,即引入了插入式注解处理API(Pluggable Annotation Processing API)。javac从java6开始支持“JSR 269 API”规范,只要程序实现了该API,就能在javac运行的时候得到调用,而Lombok实现了“JSR 269 API”,在编译时,javac编译源码的具体流程如下:Source File -> Parse -> AST -> Annotation Processing -> Modified AST -> Analyze and Generate -> Byte Code
Lombok引入项目 引入Lombok jar包

在项目中引入Lombok的方法有很多,在此以Maven为例进行讲解,其他途径可以参考官方网站https://projectlombok.org/
打开pom.xml文件,添加以下依赖。


    org.projectlombok
    lombok
    1.16.18
    provided
IDEA/Eclipse安装Lombok插件

在上面提到,Lombok需要额外的环境配置,此处以IDEA为例进行讲解。

第一步,打开File -> Settings -> Plugins,输入Lombok Plugin点击搜索。

第二步,重启IDE使插件生效。

Lombok实战Coding

完成了上述准备之后,就可以愉快的使用Lombok进行编码了。编码之前首先为大家介绍一下Lombok的基本用法。

@Data
包含了 @Getter @Setter @ToString @EqualsAndHashCode
即自动为类生成所有getter、setter、toString、eaquals以及hashCode方法

@Getter 为所有属性生成public修饰的get方法
@Getter(AccessLevel.PROTECTED) 为所有属性生成protected修饰的get方法

@Setter 为所有属性生成public修饰的set方法
@Setter(AccessLevel.PROTECTED) 为所有属性生成protected修饰的set方法

@NoArgsConstructor 无参构造器
@AllArgsConstructor 生成带有所有属性的有参构造器

@ToString 默认生成带有所有属性的toString方法
@ToString(exclude = "column") 生成除column属性之外的所有属性的toString方法
@ToString(exclude = {"column1", "column2"})
@ToString(of = "column") 生成只有column属性的toString方法
@ToString(of = {"column1", "column2"})

@EqualsAndHashCode
@EqualsAndHashCode(exclude = "column") 以column属性之外的属性作为是否是相同对象判断的标准
@EqualsAndHashCode(of = "column")) 只以column属性作为是否是相同对象判断的标准

@Slf4j 为当前类生成日志对象
@Log4j 为当前类生成日志对象

接下来让我们简单对比一下代码。
首先是未经简化的代码。

public class User {
    private Integer id;

    private String username;

    private String password;

    private String email;

    private String phone;

    public User(Integer id, String username, String password, String email, String phone) {
    this.id = id;
    this.username = username;
    this.password = password;
    this.email = email;
    this.phone = phone;
    }

    public User() {
    }

    public Integer getId() {
        return id;
   }

    public void setId(Integer id) {
        this.id = id;
   }

    public String getUsername() {
        return username;
   }

    public void setUsername(String username) {
        this.username = username;
   }

    public String getPassword() {
        return password;
   }

    public void setPassword(String password) {
        this.password = password;
   }

    public String getEmail() {
        return email;
   }

    public void setEmail(String email) {
        this.email = email;
   }

    public String getPhone() {
        return phone;
   }

    public void setPhone(String phone) {
        this.phone = phone;
   }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
          User user = (User) o;
         return Objects.equals(id, user.id) &&
                Objects.equals(username, user.username) &&
                Objects.equals(password, user.password) &&
                Objects.equals(email, user.email) &&
                Objects.equals(phone, user.phone);
      }

    @Override
      public int hashCode() {
        return Objects.hash(id, username, password, email, phone, question, answer, role, createTime, updateTime);
      }
}

接下来是使用Lombok简化后的代码。

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;

 private String username;

 private String password;

 private String email;

 private String phone;
}

Lombok的更多用法,在此不再赘述,等待大家去慢慢发掘。

Lombok工作中需要注意的点

Lombok虽然好用,但推荐大家选择适合的地方使用Lombok,例如POJO是一个好地方,因为POJO很单纯。

彩蛋 反编译大法

如果有小伙伴想要深究Lombok是如何实现插入式注解的,可以利用反编译大法查看源码。
在此推荐另一款神兵利器 Java Decompiler
官方网站为:http://java-decompiler.github.io/
有以下三种安装方式:

JD-GUI 图形化客户端

JD-Eclipse eclipse插件

JD-IntelliJ idea插件

安装完成后可以通过Java Decompiler验证Class文件。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73660.html

相关文章

  • 第二十九章:基于SpringBoot平台使用Lombok优雅编码

    摘要:还提供了全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,因为只有实体类才会存在构造函数。当然除了全部参数的构造函数,还提供了没有参数的构造函数,使用方式与一致。 Lombok对于Java偷懒开发者来说应该是比较中意的,恰恰笔者就是一个喜欢在小细节上偷懒来提高开发效率的人。所以在技术框架的海洋里寻找了很久才在GitHub开源平台上找到,而在这之前国外很多程序猿一直使用该框...

    fanux 评论0 收藏0
  • SpringBoot优雅编码之:Lombok加持

    摘要:概述通过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的代码。作用在方法参数上的注解,用于自动生成空值参数检查自动帮我们调用方法。 showImg(https://segmentfault.com/img/remote/1460000014247343); 概述 Lombok 通过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的 java 代码。典型的是对于 ...

    olle 评论0 收藏0
  • Lombok pojo类小神器

    摘要:可以去下载包目前最新版本为。对于某个具体的类来说,出于安全或者性能或者其它方面的考虑,可能并不希望全部成员都出现在方法的返回值里。根据中的建议,方法和方法要同时实现,并且保证一致性。 前言 Lombok主页 Lombok下载 Lombok引入项目之后,便可以使用 本文记录了在项目中应用Lombok时的使用案例,希望对朋友你有一些帮助。 可以去 下载jar包 maven: ...

    stackfing 评论0 收藏0
  • lombok简介

    摘要:简介是开发的神器,使用注解让实体类还有日志操作特别方便。大家搜索安装即可,不然,使用会报错。注解介绍注解可以针对类的属性字段自动生成方法。注解使用建造者模式,为制定参数赋值使用起来非常的方便,满足日常的工作需要。 lombok简介 lombok是java开发的神器,使用注解让实体类pojo还有日志slf4j操作特别方便。 lombok使用方式 (1)idea中使用lombok工具,需要...

    Jiavan 评论0 收藏0
  • SpringBoot:如何优雅地处理全局异常?

    摘要:为了贴合主题,本次主要针对全局异常处理进行举例说明。自定义异常处理自定义一个异常自定义异常程序员小明错误码错误信息显而易见,这个异常继承了,属于运行时异常。包括处理其他异常,都是这种方式。 之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contr...

    李昌杰 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<