为什么.equals()方法不会覆盖Java中的基元数组?
作者:互联网
我目前正在开发一个项目,我希望使用用户名和密码与数据库进行比较来实现登录机制.
我有这样的想法:
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