我们能不能有一个“不覆盖具体的方法.”实现接口时编译时出错?
一个更明确的例子是:
我构建了一个包含接口的框架。要使用框架,开发人员需要实现一些接口。但是如果它们不覆盖equals(Object object)和hashCode() Object方法,内部的API逻辑就会被破坏!!
所有这些都在javadoc中提到过,但是我希望有一个编译时错误,或者可能是一个运行时异常,当一个接口实现时没有覆盖一些具体化方法。
发布于 2010-01-02 17:25:27
Java附带了注释处理器功能,从Java6:源代码分析开始。(从技术上讲,它是Java 5的一部分,但是Java 6将它集成到编译器阶段,而不是一个特殊的工具)。Sun提供了这个入门指南。
在构建项目时,编译器会调用注释处理器,并且可能会像编译器一样发出错误。这是一种执行比Java指定更多规则的简洁方法。
下面是一个执行所需检查的示例处理器:
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("*")
public class CheckMethodOverride extends AbstractProcessor {
// returns true if the class has a method with the specified method name
// and specified number of parameters
private static boolean hasMethod(TypeElement clazz, String methodName, int arity) {
for (ExecutableElement method :
ElementFilter.methodsIn(clazz.getEnclosedElements())) {
if (method.getSimpleName().equals(methodName)
&& method.getParameters().size() == arity)
return true;
}
return false;
}
// the interface whose subclasses must override hashCode and equals
TypeMirror interfaceToCheck;
@Override
public void init(ProcessingEnvironment env) {
interfaceToCheck = env.getElementUtils().getTypeElement("com.notnoop.myinterface").asType();
}
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnvironment) {
for (TypeElement e :
ElementFilter.typesIn(roundEnvironment.getRootElements())) {
if (this.processingEnv.getTypeUtils()
.isSubtype(e.asType(), interfaceToCheck)
&& (!hasMethod(e, "equals", 0)
|| !hasMethod(e, "hashCode", 0))) {
processingEnv.getMessager().printMessage(Kind.ERROR,
"Class " + e + " doesn't override hashCode or equals", e);
}
}
return true;
}
}注释处理器可以直接在编译器选项中指定(通过将-processor com.notnoop.CheckMethodOverride添加到编译器选项),也可以将META-INF/services文件添加到包含处理器名称(com.notnoop.CheckMethodOverride)的类路径中。forlder META-INF可以驻留在项目的根目录中(如果使用maven,则位于资源目录中)。
这适用于任何命令行编译器。不过,我不知道如何在idea中激活它。
发布于 2010-01-02 17:25:19
你不能用接口来做这件事,但是你可以用抽象类来做。例如。
public interface Entity {
//...
}
public abstract class AbstractEntity implements Entity {
@Override
public abstract boolean equals(Object other);
@Override
public abstract int hashCode();
}并告诉开发人员,只要他们想要实现AbstractEntity,就应该扩展Entity。
如果您真的希望强制执行该规则,则需要进行某种运行时检查,比如Spring中的bean后处理程序。
发布于 2010-01-02 17:07:51
恐怕问错地方了。我们回答关于语言的问题,我们不创造语言。
Sun有一个Community,您可以在其中提出改进建议或直接的bug报告。如果你愿意的话我可以帮你找到链接。
不过,我怀疑这件事做不到。如果直到现在这还不是个好主意的话,那可能就不是了。
在短期内帮助您的东西可能是独立样式的检查程序。CheckStyle在脑海中浮现,它可能是世界上最大的品牌,它是免费的啤酒,提供了丰富的选择。我怀疑,但我不确定,“没有实现hashCode()和equals()也在其中。
https://stackoverflow.com/questions/1992123
复制相似问题