之前已经问过我遇到的问题:How to implement an interface with an enum, where the interface extends Comparable?
但是,没有一个解决方案可以解决我的确切问题,即:
我有一个值对象,类似于BigDecimal
. 有时该值不会用真实对象设置,因为该值尚不知道。所以我想用空对象模式来表示这个对象没有定义的时间。这一切都不是问题,直到我尝试让我的 Null 对象实现Comparable
接口。这是一个 SSCCE 来说明:
public class ComparableEnumHarness {
public static interface Foo extends Comparable<Foo> {
int getValue();
}
public static class VerySimpleFoo implements Foo {
private final int value;
public VerySimpleFoo(int value) {
this.value = value;
}
@Override
public int compareTo(Foo f) {
return Integer.valueOf(value).compareTo(f.getValue());
}
@Override
public int getValue() {
return value;
}
}
// Error is in the following line:
// The interface Comparable cannot be implemented more than once with different arguments:
// Comparable<ComparableEnumHarness.NullFoo> and Comparable<ComparableEnumHarness.Foo>
public static enum NullFoo implements Foo {
INSTANCE;
@Override
public int compareTo(Foo f) {
return f == this ? 0 : -1; // NullFoo is less than everything except itself
}
@Override
public int getValue() {
return Integer.MIN_VALUE;
}
}
}
其他担忧:
- 在实际示例中,我在
Foo
这里调用的内容有多个子类。 - 我可能可以通过
NullFoo
不是一个来解决这个问题enum
,但是我不能保证它只有一个实例,即Effective Java Item 3, pg。17-18