- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为这些接口(interface)实现一个值对象:
interface FooConsumer
{
public void setFoo(FooKey key, Foo foo);
public Foo getFoo(FooKey key);
}
// intent is for this to be a value object with equivalence based on
// name and serial number
interface FooKey
{
public String getName();
public int getSerialNumber();
}
abstract class AbstractFooKey
{
final private String name;
final private int serialNumber
public AbstractFooKey(String name, int serialNumber)
{
if (name == null)
throw new NullPointerException("name must not be null");
this.name = name;
this.serialNumber = serialNumber;
}
@Override public boolean equals(Object other)
{
if (other == this)
return true;
if (!(other instanceof FooKey))
return false;
return getName().equals(other.getName()
&& getSerialNumber() == other.getSerialNumber()
&& hashCode() == other.hashCode(); // ***
}
@Override public int hashCode()
{
return getName().hashCode() + getSerialNumber()*37;
}
}
AbstractFooKey.equals(x)
的情况使用
x
的值调用那是实现
FooKey
的类的实例但不子类
AbstractFooKey
.我不知道如何处理这个;一方面,我觉得相等的语义应该只取决于 name 和 serialNumber 是否相等,但看起来 hashCodes 也必须相等才能满足 Object.equals() 的契约(Contract)。
***
的行false
来自 equals()
如果 other
对象不是 AbstractFooKey
最佳答案
将所需的语义记录为契约(Contract)的一部分。
理想情况下,您实际上会有一个最终的实现,这否定了为此特定目的需要接口(interface)。您可能有其他原因需要该类型的接口(interface)。Object
的契约(Contract)要求实际上是来自 hashCode
: If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
您不需要包含 hashCode
在 equals
计算,而是需要包含 equals
中涉及的所有属性在 hashCode
计算。在这种情况下,我会简单地比较 serialNumber
和 name
在这两个 equals
和 hashCode
.
保持简单,除非你有真正的理由让它复杂化。
从一个最终的、不可变的类开始。
如果您需要一个接口(interface),请创建一个与之匹配的接口(interface),并记录语义和默认实现。
关于java - 在 Java 接口(interface)中处理 equals 和 hashCode 的微妙之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12802872/
我正在研究 http://www.qxl.dk/我遇到了问题。如果将最左边的列和中间列之间的间距与中间列和最右边的列之间的间距进行比较,您会发现它们至少相差 10 个像素。 间距是通过使用 10px
我正在寻找一种技术,它不像我见过的大多数技术那样令人讨厌,它会暂时引起人们对一小段通知的注意。 我一直在笨手笨脚地添加和删除类和包装器 div,到目前为止没有取得太大成功。 感谢建议。 最佳答案 我使
我是一名优秀的程序员,十分优秀!