小编Jaz*_*zer的帖子

使用equalsIgnoreCase覆盖hashCode并重写equals以检查相等性

我目前有一个被覆盖的equals(Object)看起来像这样:

@Override
public boolean equals(Object o) {
    if (o == this) return true;
    if (! (o instanceof Player)) return false;
    Player p = (Player) o;
    return getFirstName().equalsIgnoreCase(p.getFirstName()) && 
            getLastName().equalsIgnoreCase(p.getLastName());
}
Run Code Online (Sandbox Code Playgroud)

hashCode()目前看起来像这样:

@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + getFirstName().toLowerCase().hashCode();
    result = 31 * result + getLastName().toLowerCase().hashCode();
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是关于我重写的hashCode()方法.我知道我需要hashCode()为两个对象返回相同的值,如果它们被equals(Object)方法认为是相等的.我的直觉告诉我,有些情况下这个hashCode()会违反合同.

是否有一种可接受的方法在重写的equals(Object)方法中使用equalsIgnoreCase(String)方法并生成不违反合同的哈希码?

java overriding equals hashcode

9
推荐指数
1
解决办法
2255
查看次数

有没有办法将现有界面变成功能界面?

我使用的界面看起来像这样:

public interface ObjectListener {
    public void objectAdded(Object o);
    public void objectRemoved(Object o);
}
Run Code Online (Sandbox Code Playgroud)

我目前正在使用匿名类来实现接口,但我不关心这两种方法中的一种.有点像这样:

someObject.addListener(new ObjectListener() {

    @Override
    public void objectAdded(Object o) {
        doSomething(o);
    }

    @Override
    public void objectRemoved(Object o) {}
});
Run Code Online (Sandbox Code Playgroud)

现在,无论我在哪里,我都在Java 8中使用新的lambda表达式,并且我希望在这种情况下使用增加的简单性.毕竟,我只是实现了其中一个方法,但由于接口中有两个方法,我不能在lambda表达式中使用它.

有没有办法解决这个限制?

java lambda java-8 functional-interface

9
推荐指数
1
解决办法
789
查看次数