在编译时未评估的接口中定义的final static String - Android

1in*_*i5t 7 java android compile-time-constant compile-time

我有两个类和接口(例如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;
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在运行时,当我调用时localStore.function(),temp被赋值为null,因为InternalModelInterface.COLUMN_PARAM1为null.这有意义吗?不InternalModelInterface.COLUMN_PARAM1应该在编译时进行评估并内联?

这适用于Android应用程序.提前致谢.

我将进一步解释澄清任何混淆.

DatabaseModel解析JSON响应时实例化该类的对象.DatabaseModel类中定义的常量表示在JSON响应中查找的键.

InternalModelInterface定义了在设备上的本地(缓存)数据库中使用的列名.由于多种原因(包括它们是SQLite中的非法列名),我不会将键重用为列名.

我使用接口而不仅仅是普通类的原因是接口还指定了需要由第三类LocalStore实现的所需方法.

irr*_*ble 3

JLS3 \xc2\xa78.3.2.1、\xc2\xa79.3.1 http://java.sun.com/docs/books/jls/third_edition/html/classes.html#38010

\n\n
\n

在运行时,最终的静态变量和使用编译时常量值初始化的静态变量首先被初始化。这也适用于接口 (\xc2\xa79.3.1) 中的此类字段。\n 这些变量是“常量”,\n 永远不会被观察到具有默认初始值 (\xc2\xa74.12.5) ,甚至\n被不正当的程序所利用。

\n
\n\n

所以null永远不应该在你的例子中观察到。那么这是一个 Android 错误。

\n