@EqualsAndHashCode注解详解
- 此注解会生成equals(Object other) 和 hashCode()方法。
- 它默认使用非静态,非瞬态的属性 可通过参数exclude排除一些属性
- 可通过参数of指定仅使用哪些属性
- 它默认仅使用该类中定义的属性且不调用父类的方法
- 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。
个人理解
关于使用来说,我目前只使用它实现了判断两个类相等的情况,使用的场景是:
我有两个List集合,集合中封装了两种不同对象,而且其中一个集合的某种属性在是另一个集合中的属性。现在我需要将第二个集合的其他属性也放到集合中。翻译为能听得懂的话就是,假设有一个Person和一个Pet对象,现在你有一个Person对象所组成的List集合和一个Pet对象所组成的集合,但是里面包含的Pet对象属性中只有宠物的名字name属性有值,而你需要的是这个Pet对象的id。这里我就只需要Pet对象的属性进行比较。所以可以用@EqualsAndHashCode来进行比较时的属性省略。
代码助记
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
//@EqualsAndHashCode(callSuper = false,of = "price") 可以使用of指定某些属性
public class Cat extends Animal{
private int weight;
private String color;
public Cat(int id, String name, int weight, String color) {
super(id, name);
this.price = weight;
this.color = color;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Animal {
private int id;
private String name;
}
这是两个实体类,Cat类中继承Animal类的属性
现在我进行测试
/**
* @author xihai
* @Date 2021/12/11
***/
public class EqualsAndHashCodeTest {
/**
* Description:
* 测试lombok的EqualsAndHashCode注解对作用
* 使用@Data注解后,会在此类中存在equals(Object other) 和hashCode()方法,且不会使用父类的属性
**/
public static void main(String[] args) {
Cat cat1 = new Cat(123, "tom", 20, "红色");
Cat cat2 = new Cat(456, "tom", 10, "红色");
System.out.println(cat1.equals(cat2));
}
/**
* Description:
* 由于继承关系,Cat类中也有Animal中的属性,所以在创建子类对象时可以有父类中的属性
* 在Cat类上使用EqualsAndHashCode注解
* 当callSuper值设为true时,cat1和cat2使用了父类属性中的数据,所以两个对象的值是不相等的
* 当callSuper值设为false时,cat1和cat2相等,默认也是false属性。
**/
}
- 当Cat类上使用
@EqualsAndHashCode(callSuper = false)
而没有添加of属性
- 两个cat对象的值只有color和color属性不同时,控制台输出结果是true。这意味着两个对象他们继承自父类的id和name属性并不参与比较。也就是说,代码自动把来自父类中的属性值忽略了。
- 两个cat对象的值color和color属性属性中有一个不同时,结果毫无疑问,输出false。
- 那我如何让上一种情况下可以输出true呢?没错,那就是使用注解中使用of属性
- 这里要注意的是of属性的值为你需要去进行比较的值,比如上面两个cat对象的颜色属性都是红色,在of属性中设置为颜色color,运行之后会打印出true,证明这两个对象相等。