`
朱秋旭
  • 浏览: 230657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lombok 之 EqualsAndHashCode

阅读更多

LomBok 的相关目录已经整理出来,希望大家可以根据需求自助学习,好工具要大家分享:

@Cleanup     

@Getter, @Setter

@ToString

@EqualsAndHashCode

@Constructor

@Data & @Value

@SneakyThrows

@Synchronized

@Getter(lazy=true)

@Log

 

实现equals, hashCode方法是在编程生活中再常见不过的一个东西了,那么自然@EqualsAndHashCode 这个annotation就成为了一个非常方便的工具。默认情况下,被这个annotation标注的class会用到除了 static,transient修饰的所有属性作为判断标准,当然和之前的annotation一样,可是使用exclude选项除掉不想要的属性。也可以通过callSuper包含父类的equals 和 hashCode。 当然如果你的class 没有继承任何其他的class,你却写了callSuper,那么会收获一个编译报错。

你只要这样用:

import lombok.EqualsAndHashCode;

@EqualsAndHashCode(exclude={"id", "shape"})
public class EqualsAndHashCodeExample {
  private transient int transientVar = 10;
  private String name;
  private double score;
  private Shape shape = new Square(5, 10);
  private String[] tags;
  private int id;
  
  public String getName() {
    return this.name;
  }
  
  @EqualsAndHashCode(callSuper=true)
  public static class Square extends Shape {
    private final int width, height;
    
    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
  }
}

 就可以得到这样的效果:

import java.util.Arrays;

public class EqualsAndHashCodeExample {
  private transient int transientVar = 10;
  private String name;
  private double score;
  private Shape shape = new Square(5, 10);
  private String[] tags;
  private int id;
  
  public String getName() {
    return this.name;
  }
  
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof EqualsAndHashCodeExample)) return false;
    EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (Double.compare(this.score, other.score) != 0) return false;
    if (!Arrays.deepEquals(this.tags, other.tags)) return false;
    return true;
  }
  
  @Override public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final long temp1 = Double.doubleToLongBits(this.score);
    result = (result*PRIME) + (this.name == null ? 0 : this.name.hashCode());
    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
    result = (result*PRIME) + Arrays.deepHashCode(this.tags);
    return result;
  }
  
  protected boolean canEqual(Object other) {
    return other instanceof EqualsAndHashCodeExample;
  }
  
  public static class Square extends Shape {
    private final int width, height;
    
    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
    
    @Override public boolean equals(Object o) {
      if (o == this) return true;
      if (!(o instanceof Square)) return false;
      Square other = (Square) o;
      if (!other.canEqual((Object)this)) return false;
      if (!super.equals(o)) return false;
      if (this.width != other.width) return false;
      if (this.height != other.height) return false;
      return true;
    }
    
    @Override public int hashCode() {
      final int PRIME = 59;
      int result = 1;
      result = (result*PRIME) + super.hashCode();
      result = (result*PRIME) + this.width;
      result = (result*PRIME) + this.height;
      return result;
    }
    
    protected boolean canEqual(Object other) {
      return other instanceof Square;
    }
  }
}

 

这就是Lombok的优势所在。几个需要注意的点是,对于Array类型的变量,如果需要进行equals和hashCode的时候需要调用工具类的Arrays中的deepHashCode, deepEquals完成比较。

1
0
分享到:
评论
1 楼 cuisuqiang 2014-10-03  
不错,自定义对象对比方法的实现

相关推荐

    lombok.jar;lombok.jar

    Lombok是一款非常实用的Java库,它通过注解的方式简化了Java代码的编写,特别是减少了getter、setter、构造函数、equals、hashCode以及toString等方法的编写。Lombok的核心理念是减少样板代码,让代码更加简洁易读。...

    lombok.jar

    `@Data` 是Lombok提供的一个复合注解,它包含了`@ToString`、`@EqualsAndHashCode`、`@Getter`和`@Setter`,可以自动为类的所有非静态、非瞬态字段生成getter和setter方法,并且提供默认的toString()和equals()、...

    Lombok安装及使用

    7. **@EqualsAndHashCode**:生成`equals()`和`hashCode()`方法,通常用于实现集合中的唯一性。 8. **@Log4j / @Log / @SLF4J**:为类添加日志记录器,例如`@Log4j`将添加一个名为`log`的日志变量,支持Log4j。 9....

    lombok 1.18.24

    - `@EqualsAndHashCode`: 生成 equals 和 hashCode 方法,确保对象比较和哈希表操作的正确性。 - `@NonNull`: 标记一个字段为非空,可以自动添加空值检查。 2. **使用方法** - 添加 Lombok 依赖:在 Maven 或 ...

    lombok-plugin-2021.3.zip

    Lombok 是一个非常受欢迎的 Java 开发工具,它通过注解的方式简化了 Java 代码,尤其是数据类的编写。在给定的压缩包文件 "lombok-plugin-2021.3.zip" 中,我们找到了适用于 IntelliJ IDEA 2021.3 版本的 Lombok ...

    lombok.jar及eclipse两种安装方式

    - `@EqualsAndHashCode`:生成equals()和hashCode()方法,可以排除特定字段。 **注意事项** - 安装Lombok后,需要在编译器设置中启用注解处理器,否则IDE可能无法识别Lombok的注解。 - 如果遇到IDE无法识别Lombok...

    lombok 插件idea 下载

    `@Data`是一个组合注解,包含了`@ToString`、`@EqualsAndHashCode`、`@Getter`(对所有字段)和`@Setter`(对所有非final字段)。这大大提高了代码的可读性和维护性,因为这些常见的样板代码都由Lombok自动生成,不...

    lombok-jar包.zip

    7. `@EqualsAndHashCode`:生成equals()和hashCode()方法,通常用于实现集合类的正确比较。可以通过exclude属性排除不想参与比较的字段。 8. `@Log`系列:如`@Log4j`、`@Logback`、`@SLF4J`等,会为类生成日志记录...

    lombok-pluginDK-0.29-2019.2.zip

    - `@ToString` 和 `@EqualsAndHashCode`:自动生成对象的 `toString()` 和 `equals()`、`hashCode()` 方法。 - `@Getter` 和 `@Setter`:分别生成对应字段的 getter 和 setter 方法。 - `@Log`(通常为 `@Log4j`, `@...

    lombok插件

    Lombok插件是Java开发者常用的工具之一,它极大地提高了开发效率,尤其是在处理大量getter、setter、构造函数和其他常规样板代码时。Lombok通过提供注解的方式,允许开发者在源代码中消除这些冗余的代码,使代码更加...

    lombok-plugin-0.34-2020.1.zip

    6. `@EqualsAndHashCode`: 生成重写 `equals()` 和 `hashCode()` 方法,基于类的字段进行比较。 SpringBoot 是一个快速开发框架,它简化了 Spring 应用的创建和配置。结合 Lombok 使用,可以在 SpringBoot 项目中...

    eclipse整合lombok文档

    * @EqualsAndHashCode:实现 equals() 方法和 hashCode() 方法 * @ToString:实现 toString() 方法 * @Cleanup:关闭流 * @Synchronized:对象同步 * @SneakyThrows:抛出异常 * @Log4j:log4j 日志声明 通过使用 ...

    lombok-1.16.20.jar

    5. `@EqualsAndHashCode`:生成覆盖了Object类的equals()和hashCode()方法,用于比较对象的平等性。默认情况下,它会基于所有非static、非transient字段进行比较,也可以通过注解参数进行调整。 6. `@NonNull`:...

    lombok-plugin-0.27-2019.1.zip

    Lombok是一款非常流行的Java开发工具,它通过注解的方式简化了JavaBean的代码编写,极大地提高了开发效率。在本文中,我们将深入探讨Lombok插件及其在IntelliJ IDEA 2019.1版本中的应用。 首先,Lombok插件是针对...

    lombok-plugin-0.29-EAP.zip

    Lombok是一款非常受欢迎的Java库,它通过注解的方式简化了Java对象的创建,使得代码更加简洁、易读。Lombok 2020最新版0.29-2020.1-EAP是其在2020年发布的一个EAP(Early Access Program,早期访问版本),用于测试...

    lombok.zip(lombok.jar)

    5. `@EqualsAndHashCode`: 自动生成覆盖了`equals()`和`hashCode()`方法,确保对象的比较和哈希计算正确。 使用Lombok可以显著提升代码的可读性和维护性,因为它消除了大量的样板代码。当字段名更改时,通常需要...

    lombok试用

    如果它是相关的一部分,那么可能是用于演示Lombok如何在数据处理或文档生成场景中发挥作用,或者博主可能在研究Lombok之余,分享了一些关于GRE备考的资源。 总之,Lombok是Java开发中的一款强大工具,它通过注解...

    lombok_lombok.zip

    5. `@EqualsAndHashCode`:重写 equals 和 hashCode 方法,通常与 `@Data` 一起使用,确保对象的比较基于其属性。可以排除特定字段或指定仅包含哪些字段。 6. `@NonNull`:标记一个字段为非空,Lombok 会在 getter ...

    lombok2018.1-2019.3.zip

    1. `@Data`:这是Lombok最常用的注解之一,它会自动生成类的所有非静态字段的getter和setter,同时还会生成一个全参数的构造函数。 2. `@AllArgsConstructor`:此注解会为类生成一个包含所有字段的构造函数,而`@...

    lombok插件.zip

    3. **提高对象比较效率**:`@EqualsAndHashCode`和`@ToString`注解可以自动生成 equals() 和 hashCode() 方法,以及toString()方法,避免了常见的空指针异常问题。 4. **无参构造函数与全参构造函数**:`@...

Global site tag (gtag.js) - Google Analytics