2012-04-11 47 views
4

我感兴趣的是做这样的事情:用于强制执行静态变量或静态方法的Java注释?

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,但它不能在标准的java空中接力完成。我想知道是否有一个注释可以确保这种行为?

编辑:

我感兴趣的是指定一组用于定义如何设置东西“配置”选项的对象。这可能是命令行标志等

+1

我不知道......但是,我很好奇你要去哪里。也许有更简单的方法... – kritzikratzi 2012-04-11 21:34:43

+1

相关:[为什么我不能在界面中声明静态方法?](http://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods -in-an-interface) – 2012-04-11 21:34:55

+1

另请参阅:[Java接口静态方法替代方法?](http://stackoverflow.com/questions/1724502/java-interface-static-method-workaround) – 2012-04-11 21:35:40

回答

3

我猜你在想什么,有一个像

public void callFoo(Class<?> clazz) 

的方法,并要确保clazz有一个方法public static void foo()

我想了一会儿,没有任何想到的技术会让你在那里。您可以使用AnnotationProcessor来确保任何使用某个注释注解的类都具有特定的方法或您有什么(如果它们没有,则会生成编译错误),但无法确保(在编译时)参数通过了ClasscallFoo(Class<?> clazz)注解您的注释。

这里是一个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; 
    } 

} 

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