你不能一种方法(§8.4.3.3);这一点很清楚。 类型 (§8.9) 在 Java 中处理得非常特殊,这就是为什么 is (also , 等)对于 一个 的方法来说,这根本不可能,在更典型的使用场景中,你也不会真正想要。@Override
final
enum
equals
final
clone
hashCode
@Override
equals
enum
但是,从大局来看,您似乎正在尝试遵循 Effective Java 2nd Edition, Item 34: Emulateable exeable enum with interface 中推荐的模式(有关以下内容的更多信息,请参阅语言指南):enum
您已经定义了以下内容(现在已针对预期行为明确记录):interface
equals
public interface Group implements Group {
public Point[] getCoordinates();
/*
* Compares the specified object with this Group for equality. Returns true
* if and only if the specified object is also a Group with exactly the same
* coordinates
*/
@Override public boolean equals(Object o);
}
当然,对于 一个 定义实现者的方法应该如何表现是完全可以接受的。例如List.equals
就是这种情况。空的就是空的,反之亦然,因为这是授权的。interface
equals
LinkedList
equals
ArrayList
interface
在您的情况下,您已选择将某些实现为 .不幸的是,您现在无法按照规范实现,因为它是,而您不能实现它。但是,由于目标是符合类型,因此可以通过如下所示来使用装饰器模式:Group
enum
equals
final
@Override
Group
ForwardingGroup
public class ForwardingGroup implements Group {
final Group delegate;
public ForwardingGroup(Group delegate) { this.delegate = delegate; }
@Override public Point[] getCoordinates() {
return delegate.getCoordinates();
}
@Override public boolean equals(Object o) {
return ....; // insert your equals logic here!
}
}
现在,不要直接将常量用作 ,而是将它们包装在 .现在,此对象将具有所需的行为,如 .enum
Group
ForwardingGroup
Group
equals
interface
也就是说,而不是:
// before: using enum directly, equals doesn't behave as expected
Group g = BasicGroup.A;
您现在拥有如下内容:
// after: using decorated enum constants for proper equals behavior
Group g = new ForwardingGroup(BasicGroup.A);
附加说明
事实上,即使它本身并不遵循 的规范,也应该非常清楚地记录下来。必须警告用户,例如,常量必须包装在 a 中才能正确执行。enum BasicGroups implements Group
Group.equals
ForwardingGroup
equals
另请注意,您可以为每个常量缓存 一个 的实例。这将有助于减少创建的对象数。根据 Effective Java 2nd Edition 的第 1 项:考虑静态工厂方法而不是构造函数,您可以考虑定义方法而不是构造函数,以允许它返回缓存的实例。ForwardingGroup
enum
ForwardingGroup
static getInstance(Group g)
我假设这是一个不可变的类型(有效的Java 2nd Edition,项目15:最小化可变性),否则你可能不应该首先实现它。鉴于此,请考虑有效的Java第2版,第25项:更喜欢列表而不是数组。您可以选择返回 a 而不是 。您可以使用 Collections.unmodifiableList
(另一个装饰器!),这将使返回的不可变。相比之下,由于数组是可变的,因此在返回 .Group
enum
getCoordinates()
List<Point>
Point[]
List
Point[]
另请参见