Lombok可以做到对已有Java代码在字节码层级的改变,它的目的在于让程序员少写一些“样板代码”;所谓样板代码是那些没有营养,却又不得不写的代码;像实体中定义的getter、setter、equals、hashcode、toString等方法).
Intelli IDEA安装Lombok插件
1.【Intelli IDEA】- 【Preferences】-【plugins】
- 搜索
lombok
,点击install
.
Lombok常用注解
-
@Getter/ @Setter:
注解在属性上;为属性提供 getting 和 setting 方法 -
@ToString:
实现toString()方法 -
@EqualsAndHashCode:
实现equals()方法和hashCode()方法 -
@Data :
注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法 -
@Log4j :
注解在类上;为类提供一个 属性名为log 的 log4j 日志对象 -
@NoArgsConstructor:
注解在类上;为类提供一个无参的构造方法 -
@AllArgsConstructor:
注解在类上;为类提供一个全参的构造方法 -
@Builder:
注解在类上:实现一种Builder Patterns(生成器模式)的功能 -
@SneakyThrows:
注解到方法上:可以实现在try...catch到异常后进行的throw操作 -
@Synchronized:
注解到方法上:实现同步代码片段的功能
更多注解说明: 官方文档
Lombok使用
常用的模板代码注解化示例
@Setter
@Getter
@ToString
@EqualsAndHashCode
@Builder
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{
private Long id;
private String title;
private Double score;
private Date createTime;
public static void main(String[] args) {
Date now = new Date();
// 通用模式构建对象
BasicModel bm1 = new BasicModel();
bm1.setCreateTime(now);
bm1.setId(1L);
bm1.setScore(11D);
bm1.setTitle("Lombok示例1");
// Builder模式构建对象
BasicModel bm2 = BasicModel.builder()
.id(1L).score(11D).title("Lombok示例1").createTime(now)
.build();
// 全参构造
// 需要注意的是Lombok提供的全参构造是依赖属性在对象中定义顺序的,
BasicModel bm3 = new BasicModel(2L, "Lombok示例1", 11D, now);
// toString使用
System.out.println("bm1 = " + bm1);
System.out.println("bm2 = " + bm2);
System.out.println("bm3 = " + bm3);
// equals()使用
System.out.println("bm1.equals(bm2) = " + bm1.equals(bm2));
System.out.println("bm1.equals(bm3) = " + bm1.equals(bm3));
}
}
示例执行结果
bm1 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm2 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm3 = BasicModel(id=2, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm1.equals(bm2) = true
bm1.equals(bm3) = false
上面的注解可以简化为如下
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{
private Long id;
private String title;
private Double score;
private Date createTime;
}
Lombok问题方案
问题: 父子类集成关系中中全参构造, 以及Builder模式构建对象时,父类属性不可见。
方案:
@Data
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{
private Long id;
private String title;
private Double score;
private Date createTime;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
class ArticleModel extends BasicModel{
private String author;
private String images;
// 增减该构造方案, 此时子类中有三个构造,@NoArgsConstructor、@AllArgsConstructor、当前构造
@Builder
public ArticleModel(Long id, String title, Double score, Date createTime,
String author, String images) {
super(id, title, score, createTime);
this.author = author;
this.images = images;
}
public static void main(String[] args) {
Date now = new Date();
// Builder模式构建对象
ArticleModel am1 = ArticleModel.builder()
.id(1L).score(11D).title("Lombok示例1").createTime(now)
.author("Elon.su").images("图片地址")
.build();
// 常见的模板对象创建
ArticleModel am2 = new ArticleModel("Elon.su", "图片地址");
am2.setId(1L);
am2.setTitle("Lombok示例1");
am2.setCreateTime(now);
// toString使用
System.out.println("am1 = " + am1);
System.out.println("am2 = " + am2);
// equals()使用
System.out.println("am1.equals(am2) = " + am1.equals(am2));
}
}
示例执行结果
am1 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
am2 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=null, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
am1.equals(am2) = true
网友评论