Lombok可以使Bean变得很简洁,功能也很强大,但是实际开发我们往往不需要用到它所有的功能。所以,本文只讲经常用到的注解。
这个插件应该是必备的,配合Lombok依赖,可以用@Data
、@AllArgsConstructor
、@NoArgsConstructor
等注解替代getter/setter、全参构造、无参构造,从而让代码变得非常简洁。
下面是maven依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Data
@Data = getter/setter + toString() + equals() + hashCode()
一个@Data做了这么多事,并不一定是好事。尤其是hashCode(),有时我们并不需要对所有字段进行计算得到hashCode,此时就不宜用@Data自动生成的hashCode()。
遵从最少依赖原则,你需要什么就加什么,但想偷懒就直接@Data,问题也不大。
@Data
public class UserVo {
String name;
Integer age;
}
Lombok并不会减慢运行速度,因为@Data这些注解是在编译期解析的,底层字节码其实和手写getter/setter是一样的。
@Builder
打上这个注解后,属性就有了同名的方法,支持链式调用:
画风突变:
UserVo.builder().name("剽悍一小兔").age(30).build();
由于@Builder默认会添加一个私有的Constructor,会导致我们无法通过new创建对象。如下图,直接new会报错。
解决办法是添加@NoArgsConstructor
,@AllArgsConstructor
。
@Getter @Setter
上面说了,@Data = getter/setter + toString() + equals() + hashCode()
一个@Data做了这么多事,并不一定是好事。尤其是hashCode(),有时我们并不需要对所有字段进行计算得到hashCode,此时就不宜用@Data自动生成的hashCode()。
如果你只是想不写Getter,Setter,那么就单纯用这两个注解就行。
@Getter
@Setter
public class UserVo {
String name;
Integer age;
}
测试:
UserVo userVo = new UserVo();
userVo.setName("越野兔");
userVo.setAge(18);
如果你喜欢链式,就加上@Accessors(chain = true)
,使用如下
userVo.setName("越野兔").setAge(18);
返回的是对象本身,很方便。
@slf4j
Lombok还提供了日志注解@Slf4j,俗称“酸(S)辣(L)粉(F)”,
这个直接一般加在业务类上面,省去了设置logger对象的麻烦。
@Service
@Slf4j
public class ArticleReadServiceImpl implements ArticleReadService {
...
@Override
public PageVo<TagDTO> queryTagsByArticleId(Long articleId) {
log.info("文章id:{}",articleId);
List<TagDTO> tagDTOS = articleTagDao.queryArticleTagDetails(articleId);
return PageVo.build(tagDTOS, 1, 10, tagDTOS.size());
}
...
}
打日志时尽量别用字符串拼接,不够直观且效率低,应该使用{}占位符,用逗号隔开。
关于lombok,我们掌握这些,就够够的了。