Java annotation for enforcing static variables or static methods?
我有兴趣这样做:
1 2 3 4 5 | public interface Foo { public static"abstract" Bar SOME_BAR; // subclasses define one of these } |
和
1 2 3 4 5 | public interface Foo { public static"abstract" Baz buildABas(...); // subclasses define this method } |
没有静态,这是OOP 101,但它不能在标准的OOP Java中完成。我想知道是否有注释可以确保这种行为?
编辑:
我有兴趣指定一组选项来定义如何为"可配置"对象设置内容。这可能是命令行标志等。
我猜你想要的是一种方法
1 | public void callFoo(Class<?> clazz) |
你要确保
我想了一会儿,想到的任何技术都不能让你达到目的。您可以使用
这是一个注释处理器,它可以让你走到一半:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Messager; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; @SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedAnnotationTypes("so.Foo") public class FooAnnotationProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { TypeElement foo = processingEnv.getElementUtils().getTypeElement("so.Foo"); Set<? extends Element> classes = roundEnv.getElementsAnnotatedWith(foo); Messager messenger = processingEnv.getMessager(); for (Element e : classes) { boolean found = false; for (Element method : e.getEnclosedElements()) { messenger.printMessage(Diagnostic.Kind.ERROR, method.getSimpleName()); if (method.getKind() == ElementKind.METHOD && method.getSimpleName().toString().equals("getInstance")) { found = true; break; } } if (!found) { messenger.printMessage(Diagnostic.Kind.ERROR, "The following class does not implement getInstance :" + e.getSimpleName(),e); } } return true; } } |
最后,我建议您要么允许它在运行时强制执行,要么重新设计代码,这样就不需要使用静态方法。