点击上方“搜云库技术团队”,选择“设为星标”

回复“1024”或“面试题”获取学习资料

还在编写无聊枯燥又难以维护的POJO吗?洁癖者的春天在哪里?请看Lombok!在过往的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。首先说明一下:任何技术的出现都是为了解决某一类问题的,如果在此基础上再建立奇技淫巧,不如回归Java本身。应该保持合理使用而不滥用。

Lombok的使用非常简单,下面我们一起来看下:

1、引入相应的maven包

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId> <version>1.16.18</version>  <scope>provided</scope>
</dependency>

Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。

2、添加IDE工具对Lombok的支持

IDEA中引入Lombok支持如下:

点击File-- Settings设置界面,安装Lombok插件:

点击File-- Settings设置界面,开启Annocation Processors:

开启该项是为了让Lombok注解在编译阶段起到作用。

Eclipse的Lombok插件安装可以自行百度,也比较简单,值得一提的是,由于Eclipse内置的编译器不是Oracle javac,而是eclipse自己实现的Eclipse Compiler for Java (ECJ).要让ECJ支持Lombok,需要在eclipse.ini配置文件中添加如下两项内容:

-Xbootclasspath/a:[lombok.jar所在路径]

-javaagent:[lombok.jar所在路径]

3、Lombok实现原理

自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。Lombok就是一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:

1、javac对源代码进行分析,生成一棵抽象语法树(AST)

2、javac编译过程中调用实现了JSR 269的Lombok程序

3、此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树(AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点

5、javac使用修改后的抽象语法树(AST)生成字节码文件

4、Lombok注解的使用

POJO类常用注解:

@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。

package com.trace;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
/** * Created by Trace on 2018/5/19.<br/> * DESC: 测试类 */
@SuppressWarnings("unused")
public class TestClass {    public static void main(String[] args) {    }   @Getter(value = AccessLevel.PUBLIC)   @Setter(value = AccessLevel.PUBLIC)   public static class Person {    private String name;    private int age;    private boolean friendly;   }   public static class Animal {    private String name;    private int age;    @Getter @Setter private boolean funny;    }
}

在Structure视图中,可以看到已经生成了getter/setter等方法:

编译后的代码如下:[这也是传统Java编程需要编写的样板代码]

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.trace;
public class TestClass {    public TestClass() {    }   public static void main(String[] args) {    }   public static class Animal {    private String name;    private int age;    private boolean funny;  public Animal() {   }   public boolean isFunny() {  return this.funny;  }   public void setFunny(boolean funny) {   this.funny = funny;    }   }   public static class Person {    private String name;    private int age;    private boolean friendly;   public Person() {   }   public String getName() {   return this.name;   }   public int getAge() {   return this.age;    }   public boolean isFriendly() {   return this.friendly;   }   public void setName(String name) {  this.name = name;  }   public void setAge(int age) {   this.age = age;    }   public void setFriendly(boolean friendly) { this.friendly = friendly;  }   }
}

@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。

@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode

@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。

staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor:生成无参构造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;

@AllArgsConstructor:生成全参构造器。

编译后结果:

public static class Person {  @NonNull   private String name;    private int age;    private boolean friendly;   public String toString() {  return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")";  }   @NonNull   public String getName() {   return this.name;   }   public int getAge() {   return this.age;    }   public boolean isFriendly() {   return this.friendly;   }   public void setName(@NonNull String name) {    if(name == null) {    throw new NullPointerException("name");   } else {    this.name = name;  }   }   public void setAge(int age) {   this.age = age;    }   public void setFriendly(boolean friendly) { this.friendly = friendly;  }   private Person() {  }   private static TestClass.Person of() {  return new TestClass.Person();  }   @ConstructorProperties({"name"}) Person(@NonNull String name) { if(name == null) {    throw new NullPointerException("name");   } else {    this.name = name;  }   }   @ConstructorProperties({"name", "age", "friendly"})  public Person(@NonNull String name, int age, boolean friendly) {   if(name == null) {    throw new NullPointerException("name");   } else {    this.name = name;  this.age = age;    this.friendly = friendly;  }   }
}

@Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder:作用于类上,将类转变为建造者模式

@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:

其他重要注解:

@Cleanup:自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象

编译后结果如下:

是不是简洁了太多。

@SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下:

@Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大

敬请关注「搜云库技术团队」微信公众号,获取最新文章

来源:juejin.im/post/5b00517cf265da0ba0636d4b

整编:搜云库技术团队,欢迎广大技术人员投稿

如果对本文的内容有疑问,请在文章留言区留言,谢谢。

》》》福利 + 程序员工作内推群《《《

2000道 互联网Java工程师 面试题 共768页.pdf

关注公众号并回复:面试题” 无套路获取

更多技术干货

推荐:近300篇:历史技术文章,20大分类整理

1、懂点 Nginx 如何实现反向代理与负载均衡,是面试加分项 2、面试官:SpringBoot jar 可执行原理,知道吗? 3、很高兴!终于在生产上踩到了慢查询优化的坑 4、精选 Dubbo RPC 面试题,比较全面,含答案 5、Logback 这样配置,TPS提高10倍

代码洁癖的春天!Java 效率工具之 Lombok相关推荐

  1. Java 效率工具之 Lombok

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:LiWenD正在掘金 链接: ...

  2. Java效率工具之Swagger2

    现代化的研发组织架构中,一个研发团队基本包括了产品组.后端组.前端组.APP端研发.测试组.UI组等,各个细分组织人员各司其职,共同完成产品的全周期工作.如何进行组织架构内的有效高效沟通就显得尤其重要 ...

  3. 代码洁癖症的我,学习 Lint 学到心态爆炸

    本文由 GitCode8 授权投稿 原文链接:https://juejin.im/post/5d307615f265da1b6b1d0dd9 前言 以前对下面的问题,我的态度是,不报错就是没问题,报错 ...

  4. 四种代码洁癖类型,程序员看了直呼内行

    很多程序员在写代码的时候 都有自己的独特的习惯 比较典型的就是"代码洁癖" 他二哥收集了一些代码洁癖症状 分了四个类型 来看看有没有你对应的吧 看到大家都如此极致的追求, 他二哥实 ...

  5. 四种代码洁癖类型,程序员看了直呼内行(文末经典书送)

    很多程序员在写代码的时候 都有自己的独特的习惯 比较典型的就是"代码洁癖" 我收集了一些代码洁癖症状 分了四个类型 来看看有没有你对应的吧 一.极简断舍离型 二.距离产生美型 三. ...

  6. 【代码洁癖症】第1回-简单工厂模式

    [代码洁癖症]第1回-简单工厂模式 序言 在一个宁静的午后,我有幸拜读了程杰大鸟的<大话设计模式> 觉得这是一本不可多得的好书 奈何里面都是C++代码写的示例,对于学Java的同学不是很友 ...

  7. 代码洁癖系列(八):迭代的原则

    我们都知道,一个软件的维护成本往往要高于其研发成本.在维护过程中,我们的代码需要不断的进行迭代.迭代的目的有两个:修复bug和增加新特性.但是迭代也会带来一系列新的问题,比如新的bug,或者是破坏代码 ...

  8. 代码洁癖系列(六):处理错误

    程序运行过程中,有些错误是不可避免的,而如何使程序在出现错误时代码仍然正常工作就成了程序员的日常工作之一.那么处理错误和代码整洁有什么关系呢? 前面我们提到过,try-catch代码块会破坏代码的结构 ...

  9. 代码洁癖系列(五):外在的格式美

    我们在阅读一些优秀项目的源码时,一定会感叹他们代码的整洁和一致性.而作为第一印象,代码格式的整齐是让人能够继续阅读下去的动力.今天我们分别从垂直格式和横向格式两个方面来讨论代码的格式.修正格式的方法有 ...

最新文章

  1. 你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了...
  2. 用百度siteapp的uaredirect.js判断用户访问端而进行域名的自动跳转
  3. python与人工智能编程-人工智能与Python关系浅谈
  4. 【必看】新手妹子一键删库,老司机机智救场
  5. 我在全球最大的同性社交平台那点事
  6. python属于私有属性_Python私有属性和受保护的属性原理解析
  7. yum命令不能使用的相关错误
  8. 浏览器渲染过程与性能优化
  9. kali下破解小区门禁卡实例
  10. 递归方式计算一个数的几次方
  11. 打开客户端出现 sorry this application cannot run under a virtual machine错误
  12. 这16个数据可视化案例,惊艳了全球数据行业
  13. Java练习题11.2 方法的重载
  14. android amr base64,base64 音频数据在部分手机播放失败 setDataSourceFD failed.:status=0x80000000...
  15. 智慧工厂之化工厂人员定位中的智能访客管理系统-新导智能
  16. 携手腾讯官方打造,微信(统信UOS版)首发
  17. windos命令小全
  18. 开发者的如何优雅的使用OSX
  19. biomarker研究思路
  20. 解析steam教育中的技术赋能

热门文章

  1. SpringMVC 返回json
  2. 大数据系列6:HBase – 基于Hadoop的分布式数据库
  3. HighChart学习-更新数据data Series与重绘
  4. hdu 4263(有限制的生成树)
  5. Tutorial——使用Maven开发Cloud Driver
  6. centos8编译openssl-1.0.2u、openssl-1.1.1k
  7. 1027 Colors in Mars
  8. shell中竖线的作用_如何在 Linux 中安装、配置和使用 Fish Shell?
  9. linux设置nexus开机自启动_在linux中使用nexus搭建maven私服
  10. Sublime Text保存文件时自动去掉行末空格