ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

为什么.equals()方法不会覆盖Java中的基元数组?

2019-09-10 12:04:15  阅读:214  来源: 互联网

标签:java arrays equals language-design


我目前正在开发一个项目,我希望使用用户名和密码与数据库进行比较来实现登录机制.

我有这样的想法:

public boolean verifyUser( String username, char[] password ) 
{
  List<char[]> dbpass = getPasswords( username );
  if ( dbpass.contains( password ) )
  {
    overwriteWithNonsense( password );
    return true;
  }
  overwriteWithNonsense( password );
  return false;
}

当我注意到我的单元测试失败了.所以我深入研究了一下,注意到Object :: equals方法没有覆盖基元数组,这解释了为什么List :: contains总是计算为false.

我知道有一种可能的解决方法:

if ( dbpass.stream().anyMatch( pw -> Arrays.equals( pw, password ) ) )
{
  overwriteWithNonsense( password );
  return true;
}

我的问题是为什么设计师选择保持Object :: equals的’默认实现’?使用静态实用程序方法(如Arrays.equals(array1,array2))实现框架会不会更方便?

解决方法:

任何数组的集合都是糟糕的设计.它们不应该一起使用.通过引入一个简单但需要的类,你可能更好:

public class Password{
     private final char[] password;

     public Password(char[] password){
         this.password = password;
     }

     @Override
     public boolean equals(Object obj){
         // equals logic
     }

     @Override
     public int hashCode(){
         // hashCode logic
     }
}

然后有一个List< Password>. (我还缩短了你的verifyUser方法,因为它看起来有点多余):

public boolean verifyUser( String username, char[] password ){
    List<Password> dbpass = getPasswords(username);
    boolean contained = dbpass.contains(new Password(password));
    overwriteWithNonsense(password);
    return contained;
}

(关于它不被覆盖的原因的另一个问题主要是偏离主题,因为只有java-devs才能真正回答这个问题.)

标签:java,arrays,equals,language-design
来源: https://codeday.me/bug/20190910/1798332.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有