2012-04-11 8 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ですが、それは、標準的なOOP Javaで行うことはできません。この動作を保証するアノテーションがあるのだろうか?

編集:

i「が設定可能な」オブジェクトのために物事を設定する方法を定義するオプションのセットを指定するに興味があります。これは

+1

しかし、私はあなたがこれと一緒に行くところが好奇妙です。おそらくもっと簡単な方法があります。 – kritzikratzi

+1

related:[なぜインターフェイスで静的メソッドを宣言できませんか?](http://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods -in-an-interface) –

+1

参照:[Javaインターフェイスの静的メソッドの回避策?](http://stackoverflow.com/questions/1724502/java-interface-static-method-workaround) –

答えて

3

私はあなたが希望しているのかを推測しているが、

public void callFoo(Class<?> clazz) 

のような方法を有することであり、あなたがclazzの方法public static void foo()を持っていることを確認したいなど、コマンドラインフラグである可能性があります。

私はこれについてしばらく考えていましたが、心に浮かぶ技術はどれもあなたをそこに連れてこないでしょう。 AnnotationProcessorを使用すると、特定の注釈で注釈を付けられたクラスに特定のメソッドがあるかどうかを確認できます(そうでない場合はコンパイルエラーが発生します)。ただし、コンパイル時にClass引数が渡されるようにする方法はありませんcallFoo(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; 
    } 

} 

最終的に、私はあなたを示唆してどちらかの静的メソッドを使用する必要はありませんので、それは実行時に強制何かしたり、再設計あなたのコードであることをできるようになります。

関連する問題