7

我有两个类和一个接口(例如DatabaseModelLocalStore和 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(), temp 被分配为 null,就像InternalModelInterface.COLUMN_PARAM1null 一样。这有意义吗?不InternalModelInterface.COLUMN_PARAM1应该在编译时评估和内联吗?

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

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

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

定义设备上本地(缓存)数据库中使用的InternalModelInterface列名。由于几个原因(包括它们的键是 SQLite 中的非法列名),我没有将键重用为列名。

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

4

2 回答 2

3

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

在运行时,最终的静态变量和使用编译时常量值初始化的静态变量首先被初始化。这也适用于接口中的此类字段(第 9.3.1 节)。这些变量是“常数”,即使是狡猾的程序,也永远不会观察到它们具有默认初始值(第 4.12.5 节)。

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

于 2011-05-19T19:35:55.690 回答
0

我不是 android 专家,但我认为如果你不创建类的实例,它会在编译时进行优化。如果您为 DatabaseModel 创建一个构造函数并在某处实例化它,它似乎为我解决了这个问题。

于 2016-07-30T11:27:17.870 回答