减少你的重复代码-lombok使用教程-idea集成插件
来源:互联网 发布:短信猫群发软件 编辑:程序博客网 时间:2024/06/05 17:12
简介
大部分项目中都必不可少的包含数据库实体(Entity)、数据载体(dto,dataObject),而这两部分都包含着大量的没有业务逻辑的setter、getter、空参构造,同时我们一般要复写类的toString(),equals(),hashCode()方法(贫血模型)。这些工作都是重复性的工作,作为程序员,懒是必备素质之一,这些工作肯定已经有大牛封装好了处理方法,这就是lombok。
idea 安装插件,支持lombok
lombok是在编译阶段才生成相应的代码体,所以在项目中直接调用setter,getter,constructor会报错,这时候可以在IDE安装相应的插件支持lombok。这里介绍idea插件安装,eclipse请自行百度。
安装方法
- 进入设置页面(windows:setting,Mac:Preferences)
- 点击Plugin
- Browse repositories
- 搜索lombok
- 点击Install
- 安装完毕后开启注解权限才能正常使用:
- –>setting
- –>Build,Execution,Deployment
- –>Compiler
- –>Annontation Processors
- –>勾选
Enable annotation processing
- –> Apply
- 重启Idea
引入方法
gradle
// https://mvnrepository.com/artifact/org.projectlombok/lombokcompile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'
maven
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.16</version></dependency>
常用方法
@Setter
生成setter方法,final变量不包含
//原始类@Setterpublic class TestEntity { private String name; private Integer age; private final String type = "type";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { } public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; }}
@Getter
生成getter方法,final变量不包含
//原始类@Getterpublic class TestEntity { private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { } public String getName() { return this.name; } public Integer getAge() { return this.age; } public String getType() { this.getClass(); return "person"; }}
@NoArgsConstructor
生成空参构造
//原始类@NoArgsConstructorpublic class TestEntity { private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { }}
@AllArgsConstructor
生成全部参数构造
//原始类@AllArgsConstructorpublic class TestEntity { private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; @ConstructorProperties({"name", "age"}) public TestEntity(String name, Integer age) { this.name = name; this.age = age; }}
@RequiredArgsConstructor
将标记为@NoNull的属性生成一个构造器
如果运行中标记为@NoNull的属性为null,会抛出空指针异常。
//原始类@RequiredArgsConstructorpublic class TestEntity { private String name; @NonNull private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; @NonNull private Integer age; private final String type = "person"; @ConstructorProperties({"age"}) public TestEntity(@NonNull Integer age) { if(age == null) { throw new NullPointerException("age"); } else { this.age = age; } }}
@ToString
生成所有属性的toString()方法
//原始类@ToStringpublic class TestEntity { private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { } public String toString() { StringBuilder var10000 = (new StringBuilder()).append("TestEntity(name=").append(this.name).append(", age=").append(this.age).append(", type="); this.getClass(); return var10000.append("person").append(")").toString(); }}
@EqualsAndHashCode
生成equals()方法和hashCode方法
//原始类@EqualsAndHashCodepublic class TestEntity { private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { } public boolean equals(Object o) { if(o == this) { return true; } else if(!(o instanceof TestEntity)) { return false; } else { TestEntity other = (TestEntity)o; if(!other.canEqual(this)) { return false; } else { label47: { String this$name = this.name; String other$name = other.name; if(this$name == null) { if(other$name == null) { break label47; } } else if(this$name.equals(other$name)) { break label47; } return false; } Integer this$age = this.age; Integer other$age = other.age; if(this$age == null) { if(other$age != null) { return false; } } else if(!this$age.equals(other$age)) { return false; } this.getClass(); String this$type = "person"; other.getClass(); String other$type = "person"; if(this$type == null) { if(other$type != null) { return false; } } else if(!this$type.equals(other$type)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof TestEntity; } public int hashCode() { boolean PRIME = true; byte result = 1; String $name = this.name; int result1 = result * 59 + ($name == null?43:$name.hashCode()); Integer $age = this.age; result1 = result1 * 59 + ($age == null?43:$age.hashCode()); this.getClass(); String $type = "person"; result1 = result1 * 59 + ($type == null?43:$type.hashCode()); return result1; }}
@Data(常用)
@Data直接修饰POJO or beans, getter所有的变量,setter所有不为final的变量。如果你不需要默认的生成方式,直接填写你需要的annotation的就可以了。默认生成的所有的annotation都是public的,如果需要不同权限修饰符可以使用AccessLevel.NONE选项。当然@Data 也可以使用staticConstructor选项生成一个静态方法。
=@Setter+@Getter+@EqualsAndHashCode+@NoArgsConstructor
//原始类@Datapublic class TestEntity { @Setter(AccessLevel.PRIVATE) private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { } public String getName() { return this.name; } public Integer getAge() { return this.age; } public String getType() { this.getClass(); return "person"; } public void setAge(Integer age) { this.age = age; } public boolean equals(Object o) { if(o == this) { return true; } else if(!(o instanceof TestEntity)) { return false; } else { TestEntity other = (TestEntity)o; if(!other.canEqual(this)) { return false; } else { label47: { String this$name = this.getName(); String other$name = other.getName(); if(this$name == null) { if(other$name == null) { break label47; } } else if(this$name.equals(other$name)) { break label47; } return false; } Integer this$age = this.getAge(); Integer other$age = other.getAge(); if(this$age == null) { if(other$age != null) { return false; } } else if(!this$age.equals(other$age)) { return false; } String this$type = this.getType(); String other$type = other.getType(); if(this$type == null) { if(other$type != null) { return false; } } else if(!this$type.equals(other$type)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof TestEntity; } public int hashCode() { boolean PRIME = true; byte result = 1; String $name = this.getName(); int result1 = result * 59 + ($name == null?43:$name.hashCode()); Integer $age = this.getAge(); result1 = result1 * 59 + ($age == null?43:$age.hashCode()); String $type = this.getType(); result1 = result1 * 59 + ($type == null?43:$type.hashCode()); return result1; } public String toString() { return "TestEntity(name=" + this.getName() + ", age=" + this.getAge() + ", type=" + this.getType() + ")"; } private void setName(String name) { this.name = name; }}
@Builder
构造Builder模式的结构。通过内部类Builder()进行构建对象。
//原始类@Builderpublic class TestEntity { private String name; private Integer age; private final String type = "person";}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; @ConstructorProperties({"name", "age"}) TestEntity(String name, Integer age) { this.name = name; this.age = age; } public static TestEntity.TestEntityBuilder builder() { return new TestEntity.TestEntityBuilder(); } public static class TestEntityBuilder { private String name; private Integer age; TestEntityBuilder() { } public TestEntity.TestEntityBuilder name(String name) { this.name = name; return this; } public TestEntity.TestEntityBuilder age(Integer age) { this.age = age; return this; } public TestEntity build() { return new TestEntity(this.name, this.age); } public String toString() { return "TestEntity.TestEntityBuilder(name=" + this.name + ", age=" + this.age + ")"; } }}//Builder模式使用方法@Testpublic void test(){ TestEntity testEntity = TestEntity.builder() .name("java") .age(18) .build();}
@Value
与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。
//原始类@Valuepublic class TestEntity { @Setter(AccessLevel.PRIVATE) private String name; private Integer age; private final String type = "person";}//反编译的类public final class TestEntity { private final String name; private final Integer age; private final String type = "person"; @ConstructorProperties({"name", "age"}) public TestEntity(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return this.name; } public Integer getAge() { return this.age; } public String getType() { this.getClass(); return "person"; } public boolean equals(Object o) { if(o == this) { return true; } else if(!(o instanceof TestEntity)) { return false; } else { TestEntity other; label44: { other = (TestEntity)o; String this$name = this.getName(); String other$name = other.getName(); if(this$name == null) { if(other$name == null) { break label44; } } else if(this$name.equals(other$name)) { break label44; } return false; } Integer this$age = this.getAge(); Integer other$age = other.getAge(); if(this$age == null) { if(other$age != null) { return false; } } else if(!this$age.equals(other$age)) { return false; } String this$type = this.getType(); String other$type = other.getType(); if(this$type == null) { if(other$type != null) { return false; } } else if(!this$type.equals(other$type)) { return false; } return true; } } public int hashCode() { boolean PRIME = true; byte result = 1; String $name = this.getName(); int result1 = result * 59 + ($name == null?43:$name.hashCode()); Integer $age = this.getAge(); result1 = result1 * 59 + ($age == null?43:$age.hashCode()); String $type = this.getType(); result1 = result1 * 59 + ($type == null?43:$type.hashCode()); return result1; } public String toString() { return "TestEntity(name=" + this.getName() + ", age=" + this.getAge() + ", type=" + this.getType() + ")"; }}
@Synchronized
同步方法
//原始类public class TestEntity { private String name; private Integer age; private final String type = "person"; @Synchronized public void write(){ //do something }}//反编译的类public class TestEntity { private final Object $lock = new Object[0]; private String name; private Integer age; private final String type = "person"; public TestEntity() { } public void write() { Object var1 = this.$lock; synchronized(this.$lock) { ; } }}
@Cleanup @@SneakyThrows
自动调用close方法关闭资源。
//原始类public class TestEntity { private String name; private Integer age; private final String type = "person"; @SneakyThrows public void outputStream(){ @Cleanup OutputStream outputStream = new FileOutputStream(new File("/Users/hello")); }}//反编译的类public class TestEntity { private String name; private Integer age; private final String type = "person"; public TestEntity() { } public void outputStream() { try { FileOutputStream $ex = new FileOutputStream(new File("/Users/hello")); if(Collections.singletonList($ex).get(0) != null) { $ex.close(); } } catch (Throwable var2) { throw var2; } }}
- 减少你的重复代码-lombok使用教程-idea集成插件
- 减少你的重复代码-lombok使用教程-idea集成插件
- 使用 Lombok 减少你的样板代码
- idea集成Lombok插件
- IntelliJ IDEA使用教程十一 Lombok插件 安装及使用
- IDEA中使用Lombok插件
- IDEA中使用Lombok插件
- 使用Lombok简化你的代码
- lombok插件的使用
- lombok插件的使用
- 减少重复的代码
- IDEA + Maven + lombok的使用
- IDEA 集成 lombok
- 【Lombok】lombok使用教程
- 使用TreeMap减少重复代码
- Idea 安装lombok插件
- Idea 安装lombok插件
- idea 新增lombok插件
- 镜面反射辐照模型——不完全的翻译
- Windows Server AppFabric 缓存(微软分布式缓存解决方案)
- 使用crunch生成密码字典
- 网络协议(三)UDP
- Java sdut acm 3870 判定Java源文件名称
- 减少你的重复代码-lombok使用教程-idea集成插件
- C语言实现LRU缓存
- Spring验证的错误返回------BindingResult
- ant安装、环境变量配置及验证
- 大位数相除
- ElasticSearch学习30_Elasticsearch索引mapping的写入、查看与修改
- QT -- 入门
- window系统下TensorFlow安装
- NetBeans如何识别中文路径(打开含有中文的文件出现乱码)