окончательная статическая строка, определенная в интерфейсе, не оцененном во время компиляции - Android - PullRequest
7 голосов
/ 19 мая 2011

У меня есть два класса и интерфейс (например, 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, поскольку InternalModelInterface.COLUMN_PARAM1 равно нулю. Имеет ли это смысл? Разве InternalModelInterface.COLUMN_PARAM1 не должен оцениваться во время компиляции и быть встроенным?

Это для приложения Android. Заранее спасибо.

Я объясню, чтобы прояснить любую путаницу.

Объекты класса DatabaseModel создаются при анализе ответа JSON. Константы, определенные в классе DatabaseModel, представляют ключи, которые нужно искать в ответе JSON.

InternalModelInterface определяет имена столбцов, используемых в локальной (кэш) базе данных на устройстве. По нескольким причинам (включая то, что ключи являются недопустимыми именами столбцов в SQLite), я не использую ключи в качестве имен столбцов.

Причина, по которой я использую интерфейс, а не просто класс, заключается в том, что интерфейс также определяет необходимые методы, которые должны быть реализованы третьим классом, LocalStore.

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

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.

0 голосов
/ 30 июля 2016

Я не эксперт по Android, но думаю, что если вы не создадите экземпляр класса, он оптимизируется во время компиляции. Если вы создадите конструктор для DatabaseModel и создадите его где-нибудь, это, похоже, решит это для меня.

...