问题

在Java领域,我们经常需要编写equalshashCodetoString方法。 老实说,这通常只是一个样板义务。

得益于智能IDE,我们通常不再自己这样做。 我们只是让和IDE一起努力。 不过有一个问题。 生成的代码通常非常丑陋。 让我们考虑以下POJO:

public class Beer {private String brand;private String type;private int degrees;private double alcoholPercentage;private List<String> ingredients;// constructor// getters, setters if needed}

通常的解决方案

所有主要的IDE都具有生成我提到的方法的能力,但这就是hashCode,equals和toString的样子:

1.等于– IF语句的长列表...

@Override
public boolean equals(final Object o) {if (this == o) {return true;}if (!(o instanceof Beer)) {return false;}final Beer beer = (Beer) o;if (Double.compare(beer.alcoholPercentage, alcoholPercentage) != 0) {return false;}if (degrees != beer.degrees) {return false;}if (!brand.equals(beer.brand)) {return false;}if (!ingredients.equals(beer.ingredients)) {return false;}if (!type.equals(beer.type)) {return false;}return true;
}

2. hashCode –混淆魔术数字,异或运算

@Override
public int hashCode() {int result;long temp;result = brand.hashCode();result = 31 * result + type.hashCode();result = 31 * result + degrees;temp = alcoholPercentage != +0.0d ? Double.doubleToLongBits(alcoholPercentage) : 0L;result = 31 * result + (int) (temp ^ (temp >>> 32));result = 31 * result + ingredients.hashCode();return result;
}

3. toString –讨厌的字符串连接

@Override
public String toString() {return 'Beer{' +'brand='' + brand + '\'' +', type='' + type + '\'' +', degrees=' + degrees +', alcoholPercentage=' + alcoholPercentage +', ingredients=' + ingredients +'}';
}

GOOGLE GUAVA解决方案

也许您听说过Google Guava 。 也许您已经在使用它。 无论如何,Google Guava是一个不错的小图书馆,为Java提供了很多便利。 使用番石榴,我们可以重写上面的三种方法来更好地寻找替代方法:

1.等于–将IF语句大军转变为链式赎回权

@Override
public boolean equals(final Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}final Beer other = (Beer) obj;return Objects.equal(this.brand, other.brand) && Objects.equal(this.type, other.type) && Objects.equal(this.degrees, other.degrees) && Objects.equal(this.alcoholPercentage, other.alcoholPercentage) && Objects.equal(this.ingredients, other.ingredients);
}

2. hashCode –单行

@Override
public int hashCode() {return Objects.hashCode(brand, type, degrees, alcoholPercentage, ingredients);
}

3. toString –一致的链式调用

@Override
public String toString() {return Objects.toStringHelper(this).add('brand', brand).add('type', type).add('degrees', degrees).add('alcoholPercentage', alcoholPercentage).add('ingredients', ingredients).toString();
}

设置您的智能想法

对于equals和hashCode,有一个来自Michal Jedynak的名为Equals和HashCode Deluxe Generator的插件。 您可以直接在IntelliJ中安装它,只需键入CTRL + SHIFT + A (在Mac上是CMD + SHIFT + A),然后键入Browser仓库 。 那应该带您到以下对话框,您可以在其中搜索插件:

使用新的equals和hashCode插件很简单,您将在旧版本旁边紧挨着有一个新的上下文菜单选项equals()和hashCode()豪华版 。 只需按ALT + INS (在Mac上为CTRL + N),您将看到熟悉的生成菜单:

toString而言,我们只需要在IntelliJ中创建一个新模板。 按ALT + INS并转到toString()菜单选项。 单击设置按钮 ,然后导航到模板选项卡 。 在模板标签中,点击+按钮

为新模板命名(例如Guava toString左右),并将以下代码粘贴到编辑器中:

public String toString() {#set ($autoImportPackages = 'com.google.common.base.Objects')return Objects.toStringHelper(this)#foreach ($member in $members).add('$member.name', $member.accessor)#end.toString();
}

使用新模板很容易,只需进入生成菜单( ALT + INS ),选择toString()并确保选择正确的模板:

参考: IntelliJ IDEA:通过vrtoonjava博客的JCG合作伙伴 Michal Vrtiak 使用Google Guava生成equals,hashCode和toString 。

翻译自: https://www.javacodegeeks.com/2013/01/intellij-idea-generate-equals-hashcode-and-tostring-with-google-guava.html

IntelliJ IDEA:使用Google Guava生成equals,hashCode和toString相关推荐

  1. 番石榴的对象类:Equals,HashCode和ToString

    如果您有幸使用JDK 7 ,那么新的可用Objects类 ( 至少对我来说 )是实现"通用" Java对象方法(例如equals(Object) [with Objects.equ ...

  2. Google Guava库必需品

    我希望代码简单,短而又易于阅读. 不必要的复杂性分散了人们对真实情况的理解,使他们难以理解,并且可能成为生产力的真正杀手. 您知道,缠结的for循环和索引可以跟踪是否/其他情况和切换用例,空/验证检查 ...

  3. 使用 Google Guava Striped 实现基于 Key 的并发锁

    写 Java 代码至今,在应对可能冲突的共享资源操作时会尽量用 JDK 1.5 开始引入的并发锁(如 Lock 的各类实现类, ReentrantLock 等) 进行锁定,而不是原来的 synchro ...

  4. Google Guava常用工具类入门使用介绍及样例说明

    一 概述 工具类将经常用的一些方法进行了封装,遇到相同的场景时不需要重复造轮子,从而大量节省开发人员时间和提高工作效率,Guava就是谷歌发布的高效率的方法的工具包.Guava的优势: API的设计高 ...

  5. 吐血整理的Google Guava

    一.概述   Guava 是由Google开发的基于Java的开源库,包含许多Google核心库,它有助于最佳编码实践,并有助于减少编码错误.它为集合 [collections] .缓存 [cachi ...

  6. 为什么推荐 Java 程序员使用 Google Guava 编程

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...

  7. [Google Guava] 1.3-常见Object方法

    原文链接 译者: 沈义扬 equals 当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查.使用Objects.equal帮助你执行n ...

  8. [Google Guava] 2.1-不可变集合

    原文链接 译者:沈义扬 范例 01 public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( 02   ...

  9. Google Guava:您永远不会知道的5件事

    每个开发人员都可以使用哪些鲜为人知的Google Guava功能? 它是那里最受欢迎的库之一,它是开源的,您可能已经知道了,它来自人们玩Quidditch作为一项真正的运动的地方(至少在The Int ...

最新文章

  1. Redis+keepalived 主从搭建
  2. 演练-基于lamp安装wordpress--含安装包
  3. C语言在不引入第三变量下交换俩数
  4. html一个层下面两个小层并奇,我是一个奇数是一个两位数,十位数字与个位数字的积是2,猜猜看我是几?——青夏教育精英家教网——...
  5. 利用Eclipse的Update组件实现适合企业应用的更新组件(1)
  6. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug...
  7. latex 表格中虚线_如何识别和修复表格识别中的虚线
  8. 【LeetCode】152. Maximum Product Subarray
  9. 芯片业巨震!英特尔拟90亿美元卖掉NAND闪存业务
  10. 小米路由 php 服务器,小米路由器在后台不停访问小米服务器发送设备信息,继续分析发现不止如此,还......
  11. swift继承与重载
  12. 泛微OA中怎么导入html模板,如何在OA系统中设置模板标题
  13. SaaS的优势和劣势
  14. 计算机断层CT检查肺部混浊,揪出早期肺癌 低剂量电脑断层检查
  15. windos系统如何获得超级管理员权限
  16. python自动化测试实战-无涯(学习与研究)[一]
  17. 【python】定义一个“曲调类”Note,value属性表示声音的高低 Note的三个子类分别表示高音、低音和中音定义一个“乐器类”Instrument具有play()方法
  18. ORA-28000:账户已被锁定
  19. 论文笔记-ORB-SLAM2-双目与rgbd相机跟单目情况的区别
  20. 如何用计算机打出下划线,哪位可以告诉我在电脑上怎么打下划线

热门文章

  1. Linux NAT网络连接权威指南
  2. MySQL数据检索+查询+全文本搜索
  3. java线程——阻塞队列
  4. leetcode初级算法4.两个数组的交集 II
  5. apache ignite_Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序
  6. java掌握_掌握Java 11的Constantdynamic
  7. 用jackson转json_用Jackson编写大JSON文件
  8. java登录界面命令_Java命令行界面(第10部分):picocli
  9. antlr4例子_ANTLR和网络:一个简单的例子
  10. c#发送讯息_企业讯息