2016-09-27 7 views
0

あるプロジェクトで定数(静的final、コンパイル時に初期化される)が宣言されると、別のプロジェクトの参照はコンパイル時にリテラルに置き換えられます。定数参照のコンパイル時のリテラルへの置き換えの回避

それは参照をこの問題を回避し、持っている唯一の方法は、一定のフィールドを参照するのではなくリテラルは例えば「最終」クラスの定数を宣言(インタフェースではなく)と省略することがあるようです:

public class MyClass { 
    public static String MY_CONSTANT = "The constant value"; 
} 

残念ながら、私はこれを理解する前に定数でいっぱいのインターフェイスをコーディングしましたが、今は定数を変更するために、それを参照するすべてのプロジェクトを特定して再コンパイルする必要があります。私は何かがスリップする恐れがあります。

また、「最終」修飾語を含まない定数は正確に一定ではありませんか?

リテラルによる定数参照の置換を抑制できるコンパイルオプションはありますか?

+0

あなたはJavaに関する知識の中に穴を発見しました。そして記録のために:はい、これは何とか大きなセットアップでは問題です** **しかし、これはよく知られている問題です。どんな妥当な**ビルドシステム**でもそれに対処できるはずです。 **理解して**依存する必要があるすべてのクラスを再コンパイルする必要があります... – GhostCat

+0

私たちはずっと前と同じ過ちをしていました。 インタフェースをgetter-Methodsに変更しました。 と実装クラス。 Joshua Blochから "Effective Java"を追加してください。項目19: "タイプを定義するためにのみインターフェースを使用する" –

答えて

1

あなたはcompile-time constant expressionでないものが必要です。たとえば、メソッドの呼び出しはできません。したがって、各リテラルの末尾に.intern()を追加するだけで、ルールからエスケープされます。次に、各参照サイトは、ターゲットタイプが初期化され、現在の値が読み取られることを保証する必要があります。

この動作を変更するコンパイラオプションは、Java言語仕様に違反するため不可能です。

関連する問題