Java自定义equals产生的问题分析
作者:毕小宝
Java自定义equals注意事项
对于需要用某业务主键判断对象相等时,通常用 IDE 自动生成 equals
方法,选定特点的判断字段。
但对于有父类的类来说,默认有一句调用比较坑:
public class Person extends ParentObject{ private String id; private String name; private int age; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; Person person = (Person) o; return id.equals(person.id); } @Override public int hashCode() { return Objects.hash(super.hashCode(), id); } }
if (!super.equals(o)) return false;
这一句默认的代码,遭遇过两次坑。例如这里的 Person 对象只需要根据 id 相等,就视为同一个对象,但是有了这句调用,执行列表的 contains
方法始终返回 false,断点找到了这个问题。
解决办法:自定义具有父类的类的 equals 方法时,需要去掉这行。这个问题一碰到就感觉很熟悉,想起去年6月也遇到集合操作自定义对象判断失败的问题,所以断点到了 super 调用返回 false 就知道问题所在了。
logback.xml配置maxFileSize单位问题
项目中的 logback.xml 配置文件,忘记了从哪里扒来的,本地测试时只关注控制台日志,没发现问题。部署测试机器后,发现异常信息没有写入到日志文件中,为什么呢?
日志文件生成策略是滚动达到文件最大值后新建文件,配置如下:
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>50M</maxFileSize> </triggeringPolicy>
跟踪过程,打开调试配置,在 logback.xml 中添加配置:<configuration debug="true">
。
启动,查看日志插件的调试信息,异常提示 maxFileSize
属性设置报错了。调试到 logback-core 源码中,发现文件大小的单位使用的是 gb/mb/kb
,且不区分大小写。修正文件大小配置为:
<maxFileSize>50MB</maxFileSize>
为什么以前没有碰到过这个问题呢?因为以前的日志都是滚动按天生成的,这里拷贝过来的日志文件生成策略是按文件大小。这个配置有个好处,就是不会生成太多日志文件。
SpringCloud gateway项目引入druid
SpringCloud 的 gateway 项目是基于 Netty 的,与 Servlet 不相容。网关模块中需要加入数据库操作,引入 druid,常规的数据源配置报 Servlet 包相关的问题。
解决办法是,关掉 spring.datasource.druid 的 stat-view-servlet 配置:
stat-view-servlet:
enabled: false
web-stat-filter:
enabled: false
Shell编写脚本
Shell 编写脚本时,cd
命令切换到一个不存在的变量时,默认会到当前用户的 HOME 目录。
#!/sh
currentDir=$(cd `dirname $0`; pwd)
cd $currrentDir
echo `pwd`
这是常用的获取当前执行命令脚本的路径,第三行切换路径时,变量拼写错误,导致切换到脚本目录总是到了 /root
,这个低级错误,找了半天。
到此这篇关于Java自定义equals产生的问题分析的文章就介绍到这了,更多相关Java自定义equals内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!