Java奇淫巧技之 Lombok
2017-10-11 本文已影响144人
angeChen
lombok是一个通过简单的 注解 的形式来简化消除一些必须但显得很臃肿的 Java 代码的工具
简单来说,比如我们新建了一个javaBean,然后在其中写了几个属性,然后通常情况下我们需要手动去建立getter和setter方法,构造函数之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们 编译 的时候自动帮我们生成这些方法。
Lombok安装
使用lombok之前需要安装lombok到IDE,否则IDE无法解析lombok注解;首先去官网下载最新的lonbok安装包,网址:https://projectlombok.org/download 有两种安装方式
- 双击下载下来的 JAR 包安装 lombok
- 安装之前先关闭eclipse,然后双击下载的lombok.jar
- 如果像上图所示提示找不到IDE,则需要手动选择IDE
出现上面的页面时,点击 Install/Update
- 打开 Eclipse 的 About 页面我们可以看见,如下图所示,说明安装成功
- eclipse 手动安装 lombok
- 将 lombok.jar 复制到 eclipse.ini 所在的文件夹目录下
- 打开 eclipse.ini在最后面插入以下两行并保存:
-Xbootclasspath/a:lombok.jar
-javaagent:lombok.jar - 重启eclipse
Lombok使用
1. 在工程中引入lombok
在pom.xml中加入lombok依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
2. Lombok注解
- @Data(最常用)
- 包含了:@ToString, @EqualsAndHashCode, @Getter on all fields, @Setter on all non-final fields, and @RequiredArgsConstructor这些注解
- 注解在类上,提供类所有属性的 getting 和 setting 方法,此外还提供了 equals、canEqual、hashCode、toString 方法
@Data
public class Person {
private final String name;
private int age;
private double score;
private String[] tags;
}
等价于:
由上图类结构可以看出,自动添加了set/get方法,同时还有一个带有final字段参数的构造函数
public Person(String name) {
this.name = name;
}
还有toString、equals、canEqual、hashCode方法
@Override
public String toString() {
return "DataExample(" + this.getName() + ", " + this.getAge() + ", " + this.g etScore() + ", " + Arrays.deepToString(this.getTags()) + ")";
}
@Override
protected boolean canEqual(Object other) {
return other instanceof DataExample;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof DataExample)) return false;
DataExample other = (DataExample) o;
if (!other.canEqual((Object)this)) return false;
if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
if (this.getAge() != other.getAge()) return false;
if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
return true;
}
@Override
public int hashCode() {
final int PRIME = 59;
int result = 1;
final long temp1 = Double.doubleToLongBits(this.getScore());
result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
result = (result*PRIME) + this.getAge();
result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
result = (result*PRIME) + Arrays.deepHashCode(this.getTags());
return result;
}
-
@value
@Value 是 @Data 的不可变版本,用作不可变的类,就是只有 getting ,没有 setting -
@NoArgsConstructor、@AllArgsConstructor
- @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
- @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
注:这里只是列出了几个比较常用的,更多请查看官网