【问题标题】:Java annotation for enforcing static variables or static methods?用于强制执行静态变量或静态方法的 Java 注释?
【发布时间】:2012-04-24 06:01:37
【问题描述】:

我有兴趣做这样的事情:

public interface Foo {

  public static "abstract" Bar SOME_BAR; // subclasses define one of these

}

public interface Foo {

  public static "abstract" Baz buildABas(...); // subclasses define this method 

}

没有静态,这是 OOP 101,但它不能在标准 oop java 中完成。我想知道是否有注释可以确保这种行为?

编辑:

我有兴趣指定一组选项,这些选项定义如何为“可配置”对象设置事物。这可能是命令行标志等。

【问题讨论】:

标签: java static annotations


【解决方案1】:

我猜你想要的是有一个类似的方法

public void callFoo(Class<?> clazz)

并且你想确保clazz 有一个方法public static void foo()

我想了一会儿,想到的任何技术都无法帮助您实现目标。您可以使用AnnotationProcessor 来确保使用某个注释注释的任何类都具有特定方法或您拥有什么(如果没有,则生成编译错误)但无法确保(在编译时)@传递给 callFoo(Class&lt;?&gt; clazz) 的 987654325@ 参数使用您的注解进行注解。

这里有一个 AnnotationProcessor 可以帮助你完成一半:

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;
    }

}

最终,我建议您要么允许它在运行时强制执行,要么重新设计您的代码,这样您就不需要使用静态方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2019-03-10
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多