记一次使用 lombok 小小的成长感悟
公司项目里面用了 lombok,感觉这个东西真是个好东西,然后公司也用的简单,所以也没仔细看文档就开始想当然的用了,然后就悲剧了,今天就记录一下这件事,写一下经验教训,具体怎么用,大家可以看最后的参考。
lombok 有一个很好用的注解:@Data,当时以为这个注解就是相当于:@Getter和@Setter,所以有一次要重写 equals 和 hashcode 方法,然后就让 IDE 自动生成了,当时也没仔细看生成的是什么样子,然后就发现了 bug,仔细一看生成的 equals 方法原来是这样的:
package cn.bridgeli.demo;
import lombok.Data;
import java.util.Objects;
/**
* Created by bridgeli on 2018/2/25.
*/
@Data
public class LomBokTest {
private Integer id;
private String username;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
if (!super.equals(o)) {
return false;
}
LomBokTest that = (LomBokTest) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), id);
}
}
当时还以为是 idea 的 bug,因为是 idea 自动生成的,之前用 eclipse 自动生成从没问题,eclipse 自动生成的是这样的:
package cn.bridgeli.demo;
import lombok.Data;
/**
* Created by bridgeli on 2018/2/25.
*/
@Data
public class LomBokTest {
private Integer id;
private String username;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
LomBokTest other = (LomBokTest) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
return true;
}
}
然后看了他们俩生成的区别:idea 生成的有一行:super.equals(o),这就明显了,当时还以为 bug 了。然后就用了 eclipse 生成的这种,后来感觉不应该啊,问了朋友,朋友说用 idea 从没遇到过,自己就感觉很好奇,突然想到是不是因为 lombok 引起的,然后就不用 lombok 生成一次试试,结果是这样的:
package cn.bridgeli.demo;
import java.util.Objects;
/**
* Created by bridgeli on 2018/2/25.
*/
public class LomBokTest {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
LomBokTest that = (LomBokTest) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
好么,果然没问题,然后意识到可能是 lombok 的问题,但是感觉这么好的东西,不应该啊,所以就查一下,这个东西到底怎么了,然后就看到原来 @Data 这个注解的含义是:相当于是@ToString、@EqualsAndHashCode、@Getter、@Setter效果的集合,已经自动生成了 equals 和 hashcode 方法,不过是全字段的,如果自定义字段可以再次添加:
@EqualsAndHashCode(of = {"id"}, callSuper = false)
其中 of 中就是参与自动生成 equals 和 hashcode 方法的字段。
从这次的小小 bug 中,我的感悟是:有些东西,如果仅仅流于表明,可能平时不会有什么问题,但是说不定什么时候就会采坑,所以需要我们对待技术在使用的时候,刚开始可以先用,但有时间最好一定要搞好知其所以然,这样才能减少使用的过程中犯错。最后也给大家推荐一下这个小东西,感觉真的是特别好用的一个东西,具体用法大家可以看这篇文章:http://blog.csdn.net/jackie_xiaonan/article/details/24869951,感觉写的挺详细,就不做赘述了。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/522
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论