我正在为这些接口实现一个值对象:
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();
}
从我读过的内容来看(例如在接口中强制执行“equals”和接口中的toString ()、equals() 和 hashCode())看起来建议是提供一个抽象基类,例如
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() 的合同。
我可以做:
- 真的很松懈,只是忘记了标记的线
***
- 松懈并保留我所拥有的
- 如果对象不是
false
_equals()
other
AbstractFooKey
- 真的很严格并摆脱接口 FooKey 并将其替换为最终类吗?
- 别的东西?