@EqualsAndHashCode注解使用

@EqualsAndHashCode注解详解

  1. 此注解会生成equals(Object other) 和 hashCode()方法。
  2. 它默认使用非静态,非瞬态的属性 可通过参数exclude排除一些属性
  3. 可通过参数of指定仅使用哪些属性
  4. 它默认仅使用该类中定义的属性且不调用父类的方法
  5. 可通过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,证明这两个对象相等。

在这里插入图片描述

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值