java:lombok使用
1 安装lombok
https://search.maven.org:搜索lombok的版本
pom依赖如下:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
2 使用lombok
2.1 @NoArgsConstructor和@AllArgsConstructor使用:
只有@NoArgsConstructor的情况:
package com.base4;
import lombok.NoArgsConstructor;
public class MyLombok {
public static void main(String[] args) {
XX a=new XX();
}
}
@NoArgsConstructor
class XX{
private String name;
int age;
}
查看编译后的代码:(target下的classes文件夹里)
package com.base4;
class XX {
private String name;
int age;
public XX() {
}
}
这和类没有任何构造方法时,默认含有一个无参构造方法是一样的效果。
那么试下只有@AllArgsConstructor的情况:
import lombok.AllArgsConstructor;
public class MyLombok {
public static void main(String[] args) {
XX a=new XX("xiaoxu",28);
}
}
@AllArgsConstructor
class XX{
private String name;
int age;
}
编译代码如下,可知@AllArgsConstructor会自动创建一个含有全部成员变量的构造方法,且默认是public的,这种效果和直接在类中定义一个含全部成员变量的构造方法是相同的效果(当定义了含全部成员变量的构造方法,未定义无参构造方式时,只有含全部成员变量的构造方法):
package com.base4;
class XX {
private String name;
int age;
public XX(String name, int age) {
this.name = name;
this.age = age;
}
}
所以,同时定义无参构造方法和含全部成员变量的构造方法方式如下:
package com.base4;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
public class MyLombok {
public static void main(String[] args) {
XX a=new XX("xiaoxu",28);
XX b=new XX();
}
}
@NoArgsConstructor
@AllArgsConstructor
class XX{
private String name;
int age;
}
package com.base4;
class XX {
private String name;
int age;
public XX() {
}
public XX(String name, int age) {
this.name = name;
this.age = age;
}
}
2.2 @Getter和@Setter使用: 生成getter和setter
package com.base4;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
public class MyLombok {
public static void main(String[] args) {
XX a=new XX("xiaoxu",28);
XX b=new XX();
}
}
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
class XX{
private String name;
int age;
}
package com.base4;
class XX {
private String name;
int age;
public XX() {
}
public XX(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
2.3 @Data使用
package com.base4;
import lombok.*;
public class MyLombok {
public static void main(String[] args) {
// XX a=new XX("xiaoxu",28);
XX b=new XX();
}
}
@Data
class XX{
private String name;
int age;
}
编译后的代码,可知:@Data只有默认的无参构造方法,除了getter和setter,还具有equals、canEqual、hashCode、toString方法:
package com.base4;
class XX {
private String name;
int age;
public XX() {
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof XX)) {
return false;
} else {
XX other = (XX)o;
if (!other.canEqual(this)) {
return false;
} else if (this.getAge() != other.getAge()) {
return false;
} else {
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 XX;
}
public int hashCode() {
int PRIME = true;
int result = 1;
int result = result * 59 + this.getAge();
Object $name = this.getName();
result = result * 59 + ($name == null ? 43 : $name.hashCode());
return result;
}
public String toString() {
return "XX(name=" + this.getName() + ", age=" + this.getAge() + ")";
}
}
增加了@Data注解后,若希望具有含全部成员变量的构造方法,或者同时具有含参和无参构造方法(@AllArgsConstructor和@NoArgsConstructor均加上),相应的增加含参注解、无参注解即可:
@NoArgsConstructor
@AllArgsConstructor
@Data
class XX{
private String name;
int age;
}