2012-02-02 20 views
3

クラスにSerializableを実装すると、IDEはという警告を表示します。シリアル化可能なクラスYOURCLASSはlong型のstatic final serialVersionUIDフィールドを宣言しません。IDEが「宣言されていない」警告を表示するようにするインターフェイスを定義するにはどうすればよいですか?

フィールドにこの警告が表示されるように強制するインターフェイスを定義するにはどうすればよいですか。

public class MyClass implements Serializable 
{ 
    // this class has warning 
} 

public class MyClass implements MyInterface 
{ 
    // I want to have warning for this class 
} 

public interface MyInterface{ 
    public static final long myField; 
} 
+0

あなたは警告を引き起こすためにJavaアノテーションをお探しですか? – yadab

答えて

3

あなたは、コンパイラの警告やエラーを発生させるためにaspectjを使用することができます。これは、アーキテクチャの側面を強制するために使用されることもありますが、あなたにとっても当てはまるかもしれません。自身が:-)

@Aspect 
public class ArchitecturalEnforcement { 
    @Pointcut("...") 
    public void implementsInterface() {} 

    @Pointcut("...") 
    public void definesConstant(){} 

    /** Advice that defines an error when a GUI method calls a method in the DAO layer */ 
    @DeclareWarning("implementsInterface() && !definesConstant()") 
    private static final String WARNING= "..."; 
} 

もっと読むAOP(アスペクト指向プログラミング)の読者のために運動して残されている

ポイントカット定義

+0

私はあなたのコードを使用して、エラー: "Pointcutを型に解決できません"を取得しています。これは、Pointcutクラスまたはインタフェースが定義されていないことを意味します。あなたの事例の詳細を教えてください。 – breceivemail

+0

import org.aspectj.lang.annotation。* – greyfairer

2

これは、使用しているものIDEとには何も持っていない、それはあなたがあなたのインターフェイスが間違って宣言したことに関係しています。あなたのインタフェースにはメソッドシグニチャーが含まれていなければなりません。今の例では、定数の宣言だけが含まれています。あなたがインターフェイス内の変数のいずれかの種類を宣言する場合は、上記のやったような、また、既知の、静的および最終的であると考えています、

public interface MyInterface{ 
    public long doSomethingAndReturnALong(); 
    public void doSomethingElseButRequireAnInt(int var); 
} 

:有効であるためにあなたのインターフェースのために、それはより多くのこのような何かを見てする必要がありますインタフェースを実装するクラスによって変更できない定数として返されます。

希望に役立ちます! David

3

これは、Serializableインターフェイスを実装し、eclipseで設定可能なクラスの場合にのみ適用される特別なケースです。 Windows--->Preference--->Compile--Error/warnings-->Potential programming problems--->これはeclipseがこれを設定している場所です。あなたのクラスの他の手段で警告を表示するようにIDEを強制しても、javacでコンパイルすると、強制されません。

1

通常、これはJavaのインタフェースでは不可能です。

フィールドに一般にアクセスできるようにするには、とにかにgetterメソッドとsetterメソッドを提供する必要があります。これらのメソッドをインタフェースで宣言することができます。実装するクラスがそれらを宣言していない場合、コンパイラエラーが発生します。

クラスに、リフレクションによってある時点でアクセスするプライベートフィールドのみを強制したい場合は、フィールドを必要としない別のソリューションがあるかどうかを考える必要があります。多分メソッドを使用する可能性もありますか?

最後に、FindBugsのような静的解析ツールを使用して、custom bug patternsを定義することができます。したがって、このフィールドを持たないインターフェースの実装者を見つけ、FindBugsの設定でそれを有効にするルールを書くでしょう。あなたのコードにFindBugs警告を表示するFindBugs用の良いEclipseプラグインが存在します(通常のEclipse警告と同様)。

1

IDEは警告を発するものではありません。それはコンパイラです。カスタム警告が必要な場合は、カスタムコンパイラが必要です。しかし、あなたはあなたのインターフェイスでコンパイラを配布するべきです。あなたが使用できるカスタムコンパイラを作成するために


http://today.java.net/article/2008/04/09/source-code-analysis-using-java-6-apis

基本的に自分の注釈と注釈プロセッサを定義する必要があります。おそらく、クラスがそれを実装し、変数を定義していないときに警告を発するようなインターフェースの注釈を作成します。
私はまだこれをやっていないので、あなたにそれについての詳しい情報を与えることはできません。

別の可能性は、カスタム警告と注釈を定義し、既存のコンパイラプラグインを使用することです: https://checkerframework.org/
それはあなたの探求のお手伝いをします、またはあなたが最終的に独自のコンパイラプラグインを書く必要がある場合、私は知りません。

PS:この記事も、チェックアウトは:
How to intentionally cause a custom java compiler warning message?

関連する問題