IntelliJ IDEA:使用Google Guava生成equals,hashCode和toString

问题

在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仓库 。 那应该带您到以下对话框,您可以在其中搜索插件:

IntelliJ IDEA插件存储库

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

IntelliJ IDEA生成菜单

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

IntelliJ IDEA 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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css代码整理

width&#xff1a;&#xff08;宽度&#xff09; height&#xff1a;&#xff08;高度&#xff09; border&#xff1a;1px solid red&#xff1b;&#xff08;边框 &#xff1a;边框粗细 显示 颜色&#xff09; border-radius&#xff1a;10deg&#xff1b;&#xff08;边框…

Spring动态切换多数据源解决方案

Spring动态配置多数据源&#xff0c;即在大型应用中对数据进行切分&#xff0c;并且采用多个数据库实例进行管理&#xff0c;这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案&#xff0c;这就要程序在运行时根据当时的请求及系统状态来动态…

Appscan_web安全测试工具 (含修改启动浏览器的方法)

安全测试应该是测试中非常重要的一部分&#xff0c;但他常常最容易被忽视掉。 尽管国内经常出现各种安全事件&#xff0c;但没有真正的引起人们的注意。不管是开发还是测试都不太关注产品的安全。当然&#xff0c;这也不能怪我们苦B的“民工兄弟”。因为公司的所给我们的时间与…

传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读

购买链接&#xff1a;https://j.youzan.com/Zns-38我读了无数次《史记》&#xff0c;每次都是读了开头没几页就放弃&#xff0c;文言文看不懂&#xff0c;翻译的白话文内容又太枯燥&#xff0c;现在居然有图画版的史记&#xff0c;还附有说明&#xff0c;真是太好了&#xff0c…

使用执行程序和ThreadPoolExecutor的Java线程池示例

线程池管理工作线程池&#xff0c;它包含一个队列&#xff0c;使任务等待执行。 线程池管理可运行线程的集合&#xff0c;工作线程从队列中执行可运行线程。 java.util.concurrent.Executors提供java.util.concurrent.Executor接口的实现&#xff0c;以在Java中创建线程池。 让…

H5_ 多媒体video,autio使用示例

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>AV</title>6 </head>7 <body>8 <div class"content">9 <p>注意:audio标签设置…

mysql中ibdata1过大的问题

ibdata1文件是什么&#xff1f; 答&#xff1a; ibdata1是一个用来构建innodb系统表空间的文件&#xff0c;这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer。如果file-per-table选项打开的话&#xff0c;该文件则不一定包含所有表的数据。当innodb_file_pe…

go int 转切片_「快学 Go 语言」第 4 课——低调的数组

数组就是一篇连续的内存&#xff0c;几乎所有的计算机语言都有数组&#xff0c;只不过 Go 语言里面的数组其实并不常用&#xff0c;这是因为数组是定长的静态的&#xff0c;一旦定义好长度就无法更改&#xff0c;而且不同长度的数组属于不同的类型&#xff0c;之间不能相互转换…

走向REST:将Tomcat与Spring和JAX-RS嵌入(Apache CXF)

这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器&#xff1a;它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是&#xff0c;嵌入最新的Apache Tomcat 7非常容易&#xff0c;因此现在让我展示一下。 我不会重复完整的上一篇文章 &#xff0c;因为除了…

移动端下,点击a标签背景高亮问题的解决方法

在制作某个移动端项目的时候&#xff0c;发现当我们点击链接&#xff0c;input标签或者div盒子的时候&#xff0c;整个标签会出现颜色块并会闪烁一下&#xff0c;不仅影响美观&#xff0c;而且会极大降低了用户体验。  解决方案&#xff1a;-webkit-tap-highlight-color: tra…

Sublime Text 3 Mac常用快捷键与注意事项

大多数情况下容易忘记的快捷键&#xff0c;在此整理了一下。 编辑快捷键&#xff1a;cmd L&#xff1a;选择行&#xff08;重复按下将下一行加入选择&#xff09;&#xff1b;cmd D&#xff1a;选择词&#xff08;重复按下时多重选择相同的词进行多重编辑&#xff09;&#xff…

Python 基础知识整理-2

条件语句  if else 循环语句  while  for 循环之break continue break语句用来终止循环语句&#xff0c;即循环条件没有False条件或者序列还没被完全递归完&#xff0c;也会停止执行循环语句。 break语句用在while和for循环中。 continue 语句用来告诉Python跳过当前循…

js实现oss批量下载文件_js下载文件到本地各种方法总结

一、此方法火狐有些版本是不支持的window.location.href https://*****.oss-cn-**.aliyuncs.com/*********;二、为了解决火狐有些版本不支持,可以改成这种方式window.locationhttps://*****.oss-cn-**.aliyuncs.com/*********;三、该方法IE和火狐都可以,url表示要下载的文件路径…

Couchbase 101:从Java应用程序创建视图(MapReduce)

使用Couchbase 2.0开发新应用程序时&#xff0c;有时需要从代码中动态创建视图。 例如&#xff0c;在安装应用程序&#xff0c;编写一些测试时&#xff0c;可能会需要此方法&#xff1b;或者&#xff0c;在构建框架时&#xff0c;您也可以使用它&#xff0c;并希望动态创建视图…

函数的参数详解

# 函数的参数定义函数的时候&#xff0c;我们把参数的名字和位置确定下来&#xff0c;函数的接口定义就算完成了。 对于函数的调用者来说&#xff0c;只需要知道如何传递正确的参数&#xff0c;以及函数将返回什么样的值就够了 函数内政部的复杂逻辑被封装起来&#xff0c;调用…

gRPC之grpcurl

1、grpcurl grpcurl项目地址 &#xff1a;https://github.com/fullstorydev/grpcurl 一般情况下测试 gRPC 服务&#xff0c;都是通过客户端来直接请求服务端。如果客户端还没准备好的话&#xff0c;也可以使用 BloomRPC (https://appimage.github.io/BloomRPC/)这样的 GUI 客…

算法初步——two pointers

什么是 two pointers   以一个例子引入&#xff1a;给定一个递增的正整数序列和一个正整数 M&#xff0c;求序列中的两个不同位置的数 a 和 b&#xff0c;使得它们的和恰好为 M&#xff0c;输出所有满足条件的方案。 本题的一个最直观的想法是&#xff0c;使用二重循环枚举序…

H5 _拖放使用

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>拖放API</title>6 <style>7 [iddragme]{8 width: 100px;9 height: 100px; 10 …

从XaaS到Java EE – 2012年哪一种该死的云最适合我?

您是否曾经想过要让Java EE在某个地方启动和运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决…

正方体最快最简单画_素描新手入门第一幅画可不只是“正方体”

很多素描教程都把正方体作为入门第一幅画学习内容。这种现象也成了约定俗成的规矩但是&#xff0c;学过画画的人大概都知道有很多人画了多年石膏几何形、静物、人头像甚至半身像全身像。到最后落得只会画这些学过的东西。这就说明学习出了问题。绘画练习一定要弄清楚每个物体练…