wj.*_*wj. 3 java oop overriding compiler-errors interface
我们可以在实现接口时有一个" 不覆盖具体方法...... "编译时错误吗?
一个更明确的例子:
我构建了一个包含接口的框架.要使用框架,开发人员需要实现一些接口.但如果他们不覆盖equals(Object object)
和hashCode()
Object
方法,内部API逻辑将被打破!
javadoc中提到的所有内容,但我希望在没有覆盖某些混凝土方法的情况下实现接口时出现编译时错误或运行时异常.
Java附带了注释处理器功能,从Java 6开始:源代码分析.(从技术上讲,它是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;
}
}
Run Code Online (Sandbox Code Playgroud)
注释处理器可以直接在编译器选项中指定(通过添加-processor com.notnoop.CheckMethodOverride
到编译器选项),或者在META-INF/services
包含处理器名称的类路径中添加文件(com.notnoop.CheckMethodOverride
).forlder META-INF
可以存在于项目的根源目录(如果使用maven,则为资源目录).
这适用于任何命令行编译器.我不知道如何在IDE中激活它.
归档时间: |
|
查看次数: |
1050 次 |
最近记录: |