清洁责任–摆脱均等,compareTo和toString

您是否看过Java中Object类的javadoc? 大概。 您倾向于时不时地到达那里,然后沿着继承树进行挖掘。 您可能已经注意到的一件事是,每个类都必须继承许多方法。 实现自己而不是坚持使用原始方法的最喜欢的方法可能是.toString()、. equals()和.hashCode()( Per-ÅkeMinborg在本文中很好地描述了为什么应该始终实现这两种方法) )。

但是这些方法显然还不够。 许多人从标准库(如Comparable和Serializable)中混合使用其他接口。 但这真的很明智吗? 为什么每个人都想如此严重地自己实现这些方法? 好吧,如果您打算将它们存储在HashMap之类的文件中并希望控制哈希冲突,那么实现自己的.equals()和.hashCode()方法可能很有意义,但是compareTo()和toString()呢?

在本文中,我将介绍一种在Speedment开源项目中使用的软件设计方法,其中将对对象进行操作的方法实现为存储在变量中的功能引用,而不是覆盖内置在方法中的Java。 这有几个优点。 您的POJO将更短,更简洁,可以重复使用通用操作而无需继承,并且可以灵活地在不同配置之间进行切换。

原始码

让我们从下面的示例开始。 我们有一个典型的Java类,名为Person。 在我们的应用程序中,我们希望按Set的顺序打印每个人的名字,其后跟姓氏(以防两个人共享相同的名字)。

人.java

public class Person implements Comparable<Person> {private final String firstname;private final String lastname;public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname  = lastname;}public String getFirstname() {return firstname;}public String getLastname() {return lastname;}@Overridepublic int hashCode() {int hash = 7;hash = 83 * hash + Objects.hashCode(this.firstname);hash = 83 * hash + Objects.hashCode(this.lastname);return hash;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null) return false;if (getClass() != obj.getClass()) return false;final Person other = (Person) obj;if (!Objects.equals(this.firstname, other.firstname)) {return false;}return Objects.equals(this.lastname, other.lastname);}@Overridepublic int compareTo(Person that) {if (this == that) return 0;else if (that == null) return 1;int comparison = this.firstname.compareTo(that.firstname);if (comparison != 0) return comparison;comparison = this.lastname.compareTo(that.lastname);return comparison;}@Overridepublic String toString() {return firstname + " " + lastname;}
}

Main.java

public class Main {public static void main(String... args) {final Set people = new HashSet<>();people.add(new Person("Adam", "Johnsson"));people.add(new Person("Adam", "Samuelsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Cecilia", "Adams"));people.stream().sorted().forEachOrdered(System.out::println);}
}

输出量

run:
Adam Johnsson
Adam Samuelsson
Ben Carlsson
Cecilia Adams
BUILD SUCCESSFUL (total time: 0 seconds)

Person在此处实现了几种方法来控制流的输出。 hashCode()和equals()方法确保不能将重复的人添加到集合中。 sorted操作使用compareTo()方法产生所需的顺序。 重写的toString()方法最终控制了在调用System.out.println()时应如何打印每个Person。 您认识这种结构吗? 您几乎可以在几乎所有的Java项目中找到它。

替代代码

除了将所有功能都放入Person类之外,我们还可以尝试使其尽可能保持清洁,并使用功能性引用来处理这些修饰。 我们使用equals,hashCode,compareTo和toString删除所有样板,而是引入两个静态变量COMPARATOR和TO_STRING。

人.java

public class Person {private final String firstname;private final String lastname;public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname  = lastname;}public String getFirstname() {return firstname;}public String getLastname() {return lastname;}public final static Comparator<Person> COMPARATOR =Comparator.comparing(Person::getFirstname).thenComparing(Person::getLastname);public final static Function<Person, String> TO_STRING =p -> p.getFirstname() + " " + p.getLastname();
}

Main.java

public class Main {public static void main(String... args) {final Set people = new TreeSet<>(Person.COMPARATOR);people.add(new Person("Adam", "Johnsson"));people.add(new Person("Adam", "Samuelsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Cecilia", "Adams"));people.stream().map(Person.TO_STRING).forEachOrdered(System.out::println);}
}

输出量

run:
Adam Johnsson
Adam Samuelsson
Ben Carlsson
Cecilia Adams
BUILD SUCCESSFUL (total time: 0 seconds)

这种方法的好处是,我们现在可以在不更改Person类的情况下替换打印的顺序和格式。 这将使代码更易于维护,更易于重用,而不是说编写起来更快。

翻译自: https://www.javacodegeeks.com/2016/02/cleaner-responsibilities-get-rid-equals-compareto-tostring.html

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

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

相关文章

密码保护

1.更新User对象&#xff0c;设置对内的_password class User(db.Model): __tablename__ user _password db.Column(db.String(200), nullableFalse) #内部使用 2.编写对外的password from werkzeug.security import generate_password_hash, check_password_hash property d…

linux 安装wdcp控制面板

**wdCP是WDlinux Control Panel的简称,**是一套通过WEB控制和管理服务器的Linux服务器管理系统以及虚拟主机管理系统。 可以查看服务器情况,资源利用率,系统负载,内存使用率,带宽使用率&#xff1b; 可以轻松创建网站,开站点,发布网站,创建FTP,创建mysql数据库&#xff1b; 可以…

9.proc目录下的文件和目录详解

1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid&#xff0c;而每个进程都有1个目录. /proc/Version:内核版本 /proc/sys/kernel:系统内核功能 /proc/sys/net/ipv4: /proc/meminfo:系统内存信息,free -m /proc/…

java线程死锁_Java线程死锁–案例研究

java线程死锁本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析。 此案例研究还将证明掌握线程转储分析技能的重要性&#xff1b; 包括用于IBM JVM Thread Dump格式。 环境规格 – Java EE服务器&#xff1a;Oracle Weblo…

JS实现禁止浏览器后退返回上一页

<script type"text/javascript"> $(function() {//防止页面后退history.pushState(null, null, document.URL);window.addEventListener(popstate, function () {history.pushState(null, null, document.URL);});}) </script>

网页中文乱码--UTF-8和GB2312互转

一、如果你想把utf-8转为GB2312 1、用记事本打开源码&#xff0c;把换成&#xff1b;如果是JS不需要加这句&#xff0c;如果是网页最好加上这句和你页面对应的编码。 2、用记事本打开源码&#xff0c;另存为&#xff0c;编码 哪里选择 ANSI 即可。 二、如果你想把GB2312转为…

将JAR依赖项添加到Eclipse插件Maven Tycho构建

开发OPP项目时&#xff0c;一直困扰着我的是使用硬编码Java库依赖项。 我手动下载了所用库的jar &#xff0c;将其复制到需要它们的插件中的目录中&#xff0c;然后将其添加到MANIFEST.MF文件中。 您可能会问我为什么要这样做。 好吧&#xff0c;Eclipse插件&#xff08;或更正…

如何查看一个网站是否部署了SSL证书?

如何才能确定一个网站是否部署了安全的SSL证书呢&#xff1f; 答&#xff1a;能用https方式访问的站点 如果此网站部署SSL证书&#xff0c;则在需要加密的页面会自动从 http:// 变为 https:// &#xff0c;如果没有变&#xff0c;你认为此页面应该加密&#xff0c;您也可以尝试…

页面加载时模块移入动画---wow

首先官网下载&#xff1a;https://github.com/matthieua/WOW animate.css wow.js 1&#xff0c;在头部引用animate.css <link rel"stylesheet" href"css/animate.css">2&#xff0c;body底部引入wow.js 且初始化一下 <script src"js/wow.…

人工智能的概念和知识构架_概念验证:玩! 构架

人工智能的概念和知识构架我们正在开始一个新项目&#xff0c;我们必须选择Web框架。 我们的默认选择是grails&#xff0c;因为团队已经拥有使用它的经验&#xff0c;但是我决定给Play&#xff01; 和Scala有机会。 玩&#xff01; 有很多很酷的东西&#xff0c;在我的评估中&a…

团队-科学计算器-模块测试过程

项目托管平台地址&#xff1a;https://gitee.com/mamamayun/KeXueJiSuanQia/tree/master/calculator_soul3.5 模块测试:进行加减乘除运算 测试方法:反复进行计算 其他补充说明: 无 转载于:https://www.cnblogs.com/dunianze/p/8092874.html

linux 系统安装mongodb数据库---方法2

我是安装在/home/mongodb 1&#xff0c;进入/home/mongodb wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.7.tgz tar -zxvf mongodb-linux-x86_64-4.0.7.tgz cd mongodb-linux-x86_64-4.0.7/ 创建两个目录 存放数据库和日记 mkdir -p logs mkdir -p dat…

网络排错命令工具

ping tracert nslookup dig netstat 转载于:https://www.cnblogs.com/changha0/p/8111134.html

JLBH示例4 – QuickFix vs ChronicleFix基准化

在这篇文章中&#xff1a; 使用JLBH测试QuickFIX 观察QuickFix延迟如何通过百分位数降低 比较QuickFIX和Chronicle FIX 如JLBH简介中所述&#xff0c;创建JLBH的主要原因是为了测量Chronicle-FIX引擎。 我们使用了JLBH的所有功能&#xff0c;特别是吞吐量杠杆和协调遗漏的…

设计模式----java的单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一个比较简单的模式&#xff0c;它确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。今天我们就来学习一下单例模式的用法。有生之年&#xff0c;一起去看看这个美丽易碎的世界。凡有等待&am…

linux下安装pm2

提前安装node linux下安装pm2 全局安装 npm install pm2 -g安装完成后可以查看pm2的所在目录 创建软连接----根据上面的安装目录创建 ln -s /home/node/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/查看进程 pm2 list安装成功&#xff01;&#xff01;&#xff…

主机关机后第二天就无法开机_工控机几种常见的在开机或关机后不能正常使用的故障处理方法汇总...

工控机开机启动时我们经常会碰到各种不能正常使用的问题&#xff0c;下面我们把这类故障现象及处理方法在这里给大家汇总分析一下&#xff0c;希望你在碰到类似的问题时&#xff0c;能给你们提供一定的帮助&#xff01;故障现象一&#xff1a;工控机在开机过程中出现死机故障.故…

搭建PHP本地服务器(XAMPP)

1.下载XAMPP集成包 https://www.apachefriends.org/download.html2.启动前修改配置文件httpd.conf的端口号&#xff0c;例如&#xff1a;Listen 80803.启动Apache、MySQL4.找到XAMPP安装目录&#xff0c;并在xampp/htdocs下面新建一个文件夹作为你的网站根目录&#xff0c;譬如…

jboss as7 下载_JBoss AS 7:定制登录模块

jboss as7 下载JBoss AS 7很整洁&#xff0c;但是文档仍然很缺乏&#xff08;错误消息没有那么有用&#xff09;。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块&#xff0c;以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。…

网站添加页面热力图--百度统计

1&#xff0c;注册百度统计的账户并登录 https://tongji.baidu.com/web/10000307684/welcome/login 2&#xff0c;新增网站 管理-网站列表-自有网站-新增网站 3&#xff0c;新增网页热力图 基础报告-页面点击图-新增点击图 4&#xff0c;复制统计代码 把统计的代码放到…