lombok使用及常用注解
简介
大部分项目中都必不可少的包含数据库实体(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/lombok
-
compile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'
- 1
- 2
- 3
maven
-
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<version>1.16.16</version>
-
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
常用方法
@Setter
生成setter方法,final变量不包含
-
//原始类
-
@Setter
-
public 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变量不包含
-
//原始类
-
@Getter
-
public 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
生成空参构造
-
//原始类
-
@NoArgsConstructor
-
public 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
生成全部参数构造
-
//原始类
-
@AllArgsConstructor
-
public 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,会抛出空指针异常。
-
//原始类
-
@RequiredArgsConstructor
-
public 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()方法
-
//原始类
-
@ToString
-
public 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方法
-
//原始类
-
@EqualsAndHashCode
-
public 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选项生成一个静态方法。
[email protected][email protected][email protected][email protected]
-
//原始类
-
@Data
-
public 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()进行构建对象。
-
//原始类
-
@Builder
-
public 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模式使用方法
-
@Test
-
public void test(){
-
TestEntity testEntity = TestEntity.builder()
-
.name("java")
-
.age(18)
-
.build();
-
}
@Value
与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。
-
//原始类
-
@Value
-
public 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;
-
}
-
}