织梦 网站栏目管理,东莞搜索优化,沈阳凯鸿网站建设,网站和微信一、摘要Java#xff0c;作为一款非常热门的编程语言#xff0c;尽管它有着非常丰富的语言特性#xff0c;完全面向对象编程#xff0c;编程高度规范化#xff0c;但是也有一个最受大家诟病的一个缺点#xff1a;啰嗦#xff0c;尤其是当你开发了很多年之后#xff0c;…一、摘要Java作为一款非常热门的编程语言尽管它有着非常丰富的语言特性完全面向对象编程编程高度规范化但是也有一个最受大家诟病的一个缺点啰嗦尤其是当你开发了很多年之后你会明显的感受到相比动态语言java 定义变量之前要先创建类然后定义变量类型每个类要写很多的get/set/toString/hashCode/equals等等方法。尤其是当一个实体类高达几十个变量时写完get、set方法之后一个实体类的长度快接近一千行。为了避免写这些“罗嗦”的方法很多程序员一直在寻觅着找一个能够使他们摆脱这种重复劳动工作的工具例如idea、eclipse 开发工具的快捷生成get、set方法的工具还有我们今天要谈论的这个Lombok工具。二、LombokLombok 是一款非常流行的代码简洁工具利用它的注解特性直接就可以帮我们省去高大几百行的get、set方法操作非常方便。如果是idea开发工具可以直接在preferences - plugins里面搜索lombok然后点击安装即可接着在项目工程中导入lombok依赖包dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.12/versionscopeprovided/scope
/dependency最后只需要在对应的实体类上加上Data注解即可完成类属性get/set的注入。import lombok.Data;Data
public class User {private String id;private String age;private String name;//可以不用显式写get、set方法
}使用Data注解在类上这个实体类中的属性就不需要显式写get、set方法了。对这个类进行编译之后我们打开User.class文件看看编译后的文件内容长啥样public class User {private String id;private String age;private String name;public User() {}public String getId() {return this.id;}public String getAge() {return this.age;}public String getName() {return this.name;}public void setId(String id) {this.id id;}public void setAge(String age) {this.age age;}public void setName(String name) {this.name name;}public boolean equals(Object o) {if (o this) {return true;} else if (!(o instanceof User)) {return false;} else {User other (User)o;if (!other.canEqual(this)) {return false;} else {label47: {Object this$id this.getId();Object other$id other.getId();if (this$id null) {if (other$id null) {break label47;}} else if (this$id.equals(other$id)) {break label47;}return false;}Object this$age this.getAge();Object other$age other.getAge();if (this$age null) {if (other$age ! null) {return false;}} else if (!this$age.equals(other$age)) {return false;}Object this$name this.getName();Object other$name other.getName();if (this$name null) {if (other$name ! null) {return false;}} else if (!this$name.equals(other$name)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof User;}public int hashCode() {int PRIME true;int result 1;Object $id this.getId();int result result * 59 ($id null ? 43 : $id.hashCode());Object $age this.getAge();result result * 59 ($age null ? 43 : $age.hashCode());Object $name this.getName();result result * 59 ($name null ? 43 : $name.hashCode());return result;}public String toString() {return User(id this.getId() , age this.getAge() , name this.getName() );}
}很清晰的看到使用Data注解之后User类新增了get、set、hashCode、equals和toString方法。通过上面的例子大家可以发现使用Data注解可以大大减少了代码量使代码非常简洁这也是很多开发者热衷于使用Lombok的主要原因。Lombok的工作原理是怎么实现的呢由于Java的官方版本没有提供这种快速生成方法的注解工具类似Lombok这样的工具其实都是使用了从Java 6和JSR 269的Annotation Processing技术中实现方法的注入。简单的说就是使用了 Java 非公开的 API在 javac 编译代码时通过强类型转换获取JavacAnnotationProcessor对象再从JavacAnnotationProcessor的方法里面拿到抽象语法树AST做强制修改注入get、set等方法。使用Lombok这种方案有个最大的好处就是可以节省大量的重复代码让代码更佳简洁但是也有很多弊端三、有哪些坏处呢3.1、强迫队友也安装 Lombok当你在使用Lombok工具插件来快速开发项目的时候如果别的同事也要和你一起协作开发项目那么他不得不也要安装Lombok插件不然项目编译会报错。3.2、代码可调试性降低代码可调试性会降低为什么会这么说呢Lombok虽然给我们节省了get和set方法的编程但是如果我想知道类的某个属性被哪些方法操作给set了如果用原生的方法可以很好的知道调用方。但是如果使用Lombok插件来生成这个时候你根本无从得知。甚至没办法调试3.3、不懂 Lombok 注解会踩坑我们知道使用Data会重写hashCode()和equals()方法如果是单个实体类没有继承的话你使用Data不会产生问题。但是如果这个实体类又继承了父类Data只会重写子类的hashCode()和equals()方法不会把父类的属性加进去这样就会导致例如当你在使用HashMap的时候用当前这个实体类作为key可能会得到意想不到的结果。遇到这种情况你可以在类上加上这个注解EqualsAndHashCode(callSupertrue)子类的hashCode()和equals()方法会加入父类的属性。3.4、破坏封装性封装是 java 面向对象编程中非常重要的一个特性。例如针对User实体类我新家一个tag属性我只想暴露它的get方法不想暴露set方法给外部没有用Data注解的时候我可以很灵活的进行编程但是使用Data注解之后属性tag被完全暴露在外界了。public class User {private String id;private String age;private String name;private String tag 学生;public String getTag() {return tag;}}3.5、影响 jdk 升级其实以上的坑点都不算什么很大的坑点在我看来最大的坑点其实就是Lombok的工作原理使用了非官方支持的 API 接口通过程序强制植入方式来修改类实现get、set等方法的注入。按照如今 JDK 的升级频率每半年都会推出一个新的版本但是Lombok作为一个第三方工具并且是由开源团队维护的那么他的迭代速度是无法保证的。假如某天JDK把这种后门堵住了那Lombok基本上就不能用了到时候又是个麻烦事情。四、总结Lombok 作为一款非常流行的工具插件肯定有它自身的优势所在到底建不建议在日常开发中使用我个人其实是一个中立的态度如果你们团队的人都喜欢它那推荐你使用在使用之前最好培训一下有哪些坑点避免踩坑。如果多数人不太喜欢用它那就不推荐你使用很多公司禁止你使用它的原因其实这种插件有点类似那种流氓插件工作原理不是官方所认可的方式来实现假如某天新版本的 jdk 突然把这个漏洞给堵住了那么项目想要升级 jdk就比较困难。因此大家在评估要不要在代码中引入Lombok的时候在想它的优点同时能够考虑到它会带来的哪些问题那么本文的目的也就达到了五、参考1、projectlombok2、geekbang - lombok3、itpub - lombok