lombok在java项目中的使用
lombok简介
IDEA配置lombok
lombok常用的注解
@Getter/@Setter
@ToString
@NonNull
@EqualsAndHashCode
@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor
@Data
@Cleanup
@Builder
lombok简介
lombok是一个java类库,能够自动植入开发者的编译器来辅助java开发。使用lombok,可以使用一个注解来代替getter等方法的编写。使用起来非常简单,maven pom.xml文件中加入如下依赖,
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
在实体类上加上注解@Data
@Data
public class Employee{
private Long id;
private String name;
private String department;
private Long number;
}
测试代码如下:
从图片中可以看出有编译错误代码,但是执行这个测试用例可以成功。
IDEA配置lombok
IDEA中安装lombok插件可以去除编译错误,跟安装普通插件一样,File->Settings->Plugins,如下图
重启后编译错误消失,注意点击下图中右下角的Enable按钮
lombok常用的注解
@Getter/@Setter
注解在类上,为所有非静态变量生产get和set方法
@ToString
注解在pojo类上面,为类生成toString方法,如果要在toString中排除一个变量,可以在该变量上面加上注解ToString.exclude,如果要在toString中打印出非静态变量,在非静态变量上增加@ToString.Include,如果要改变打印出的变量名称,在变量上加注解@ToString.Include(name = "username"),也可以通过@ToString.Include(rank = -1)来配置打印顺序,rank值越大越先打印 ·
如下示例:
@Setter
@ToString
public class ToStringExample {
private static final int STATIC_VAR = 10;
/**姓名**/
private String name;
private Square square = new Square(5, 10);
private String[] tags;
@ToString.Include(rank = 1)
private static String password = "123456";
@ToString.Exclude
private int id;
public String getName() {
return this.name;
}
@ToString(callSuper=true)
public static class Square {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
}
public static void main(String[] args){
ToStringExample toStringExample = new ToStringExample();
toStringExample.setName("jinjunzhu");
toStringExample.setTags(new String[]{"123", "234"});
System.out.println(toStringExample.toString());
}
}点击并拖拽以移动
打印结果如下:
ToStringExample(password=123456, name=jinjunzhu, square=ToStringExample.Square(super=boot.lombok.ToStringExample$Square@446cdf90, width=5, height=10), tags=[123, 234])
@NonNull
检查借据是否为空,如果为空,抛出空指针异常
如下代码:
public class NonNullExample {
private String name;
public NonNullExample(@NonNull String name) {
this.name = name;
}
public static void main(String[] args){
NonNullExample nonNullExample = new NonNullExample(null);
}
}点击并拖拽以移动
执行后结果如下:
@EqualsAndHashCode
为类生成equals(Object other)和hashcode()方法,默认为
non-static, non-transient生成,也可以用@EqualsAndHashCode.Include或@EqualsAndHashCode.Exclude来生成或不生成
如下2段代码等价
@EqualsAndHashCode
public class EqualsAndHashCodeExample {
private transient int transientVar = 10;
private String name;
private double score;
@EqualsAndHashCode.Exclude private Square shape = new Square(5, 10);
private String[] tags;
@EqualsAndHashCode.Exclude private int id;
public String getName() {
return this.name;
}
@EqualsAndHashCode()
public static class Square {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
}
}点击并拖拽以移动
这段代码等价于如下代码
public class EqualsAndHashCodeExample {
private transient int transientVar = 10;
private String name;
private double score;
private Shape shape = new Square(5, 10);
private String[] tags;
private int id;
public String getName() {
return this.name;
}
@Override public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof EqualsAndHashCodeExample)) return false;
EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;
if (!other.canEqual((Object)this)) return false;
if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
if (Double.compare(this.score, other.score) != 0) return false;
if (!Arrays.deepEquals(this.tags, other.tags)) return false;
return true;
}
@Override public int hashCode() {
final int PRIME = 59;
int result = 1;
final long temp1 = Double.doubleToLongBits(this.score);
result = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode());
result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
result = (result*PRIME) + Arrays.deepHashCode(this.tags);
return result;
}
protected boolean canEqual(Object other) {
return other instanceof EqualsAndHashCodeExample;
}
public static class Square {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
@Override public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Square)) return false;
Square other = (Square) o;
if (!other.canEqual((Object)this)) return false;
if (!super.equals(o)) return false;
if (this.width != other.width) return false;
if (this.height != other.height) return false;
return true;
}
@Override public int hashCode() {
final int PRIME = 59;
int result = 1;
result = (result*PRIME) + super.hashCode();
result = (result*PRIME) + this.width;
result = (result*PRIME) + this.height;
return result;
}
protected boolean canEqual(Object other) {
return other instanceof Square;
}
}
}点击并拖拽以移动
@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor
@NoArgsConstructor产生一个无参构造函数
@RequiredArgsConstructor将为没有给变量生产一个只有一个参数的构造函数
@AllArgsConstructor将生成一个有所有变量的构造函数,其中的staticName属性指定生产一个静态构造函数的名称,代码如下:
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
private int x, y;
@NonNull
private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
public static void main(String[] args){
ConstructorExample<User> constructorExample1 = new ConstructorExample<User>(1, 1, new User());
ConstructorExample<User> constructorExample2 = ConstructorExample.of(new User());
}
}点击并拖拽以移动
@Data
是 @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter在所有非final变量和@RequiredArgsConstructor的汇集功能,也就是说能为POJO类所有变量生成getters方法, 为所有非final方法生产setters, toString, equals和hashCode方法代码如下:
@Data
public class DataExample {
private final String name;
@Setter(AccessLevel.PACKAGE) private int age;
private double score;
private String[] tags;
@ToString(includeFieldNames=true)
@Data(staticConstructor="of")
public static class Exercise<T> {
private final String name;
private final T value;
}
}点击并拖拽以移动
@Cleanup
用于代码执行完成后自动释放资源,代码如下:
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
@Builder
引入一个复杂的构造函数,代码如下:
@Builder
public class BuilderExample {
@Builder.Default
private long created = System.currentTimeMillis();
private String name;
private int age;
@Singular
private Set<String> occupations;
public static void main(String args){
BuilderExample.builder().created(System.currentTimeMillis()).age(30).name("jinjunzhu");
}
}
还有一些不常用的变量,不一一介绍了,大家参考如下链接:
https://projectlombok.org/features/all
文中源码地址:
https://github.com/jinjunzhu/spring-boot-mybatis.git
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
- jQuery Gallery Plugin在Asp.Net中使用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(20)-权限管理系统-根据权限获取菜单
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立
- 印度税务局调查比特币大户,需缴纳资本利得税;交易所Poloniex强制所有用户完成KYC
- Windows Server 2008R2配置MySQL Cluster
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- React Native布局详细指南
- 走进Golang之Context的使用
- 「Workshop」第十一期:降维
- 开始在 GitHub 上写博客
- 微信公众号菜单点击发送天气预报
- SAP CRM Fiori应用如何启用Sales Office和Sales Group两个字段
- 通过注册表调整 Windows 8 窗口边框宽度
- 在 Mac OS X 中创建和使用内存盘
- Mono for Android 下的 ListActivity
- 使用JavaScript Function.prototype进行代码重构的一些例子
- Activity 生命周期及其栈管理方式
- 如何操作SAP UI5应用Footer区域工具栏按钮的背景颜色
- 我的第一个 Mono for Android 应用
- 【DB笔试面试851】在Oracle中,造成“ORA-28040: No matching ...”错误的原因是什么?
- 在 Silverlight 5 项目中使用 async/await