7

2 つのクラスと 1 つのインターフェイス (たとえばDatabaseModel、、、LocalStoreおよび InternalModelInterface) があります。それらは次のように定義されています。

public class DatabaseModel {
  // ...
  public static final String KEY_PARAM1 = "param1";
}

public class LocalStore implements InternalModelInterface {
  // ...
  public void function () {
    String temp = InternalModelInterface.COLUMN_PARAM1;
  }
}

public interface InternalModelInterface {
  public static final String COLUMN_PARAM1 = DatabaseModel.KEY_PARAM1;
  // ...
}

私が経験している問題は、実行時に を呼び出すとlocalStore.function()、null と同様に temp に null が割り当てられることInternalModelInterface.COLUMN_PARAM1です。これは理にかなっていますか?InternalModelInterface.COLUMN_PARAM1コンパイル時に評価してインライン化すべきではありませんか?

これは Android アプリケーション用です。前もって感謝します。

混乱を解消するために、さらに説明します。

DatabaseModelJSON 応答が解析されると、クラスのオブジェクトがインスタンス化されます。クラスで定義された定数DatabaseModelは、JSON 応答で検索するキーを表します。

InternalModelInterface、デバイスのローカル (キャッシュ) データベースで使用される列名を定義します。いくつかの理由 (SQLite ではキーが不正な列名であることなど) から、キーを列名として再利用していません。

私が単純なクラスだけでなくインターフェイスを使用している理由は、インターフェイスが、3 番目のクラスである LocalStore によって実装する必要がある必須メソッドも指定するためです。

4

2 に答える 2

3

JLS3§8.3.2.1、§9.3.1http ://java.sun.com/docs/books/jls/third_edition/html/classes.html#38010

実行時に、finalであり、コンパイル時定数値で初期化される静的変数が最初に初期化されます。これは、インターフェースのそのようなフィールドにも当てはまります(§9.3.1)。これらの変数は「定数」であり、悪意のあるプログラムであっても、デフォルトの初期値(§4.12.5)を持つことは決してありません。

したがってnull、あなたの例では決して観察されるべきではありません。それはAndroidのバグです。

于 2011-05-19T19:35:55.690 に答える