Как я могу инициализировать этот int как константу?

Мое программное обеспечение включает в себя много изменений изображений. Вместо того, чтобы многократно искать номер ресурса, я хотел бы создать некоторые константы для представления каждой ссылки на изображение. Вот мои попытки до сих пор:

Эта попытка приводит к принудительному закрытию при запуске.

private final int EMPTY = getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        .....
    }

Эта попытка возвращает ошибку "невозможно инициализировать конечные переменные". Удаление final позволяет ему работать.

private final int EMPTY

        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            EMPTY = getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");
        }

Является ли использование констант здесь хорошей идеей?


person Declan McKenna    schedule 03.02.2012    source источник
comment
Я думал, что весь смысл констант в том, что вы не можете изменить значение?   -  person Xaisoft    schedule 04.02.2012
comment
Я не хочу менять значение. Изображение будет сохранять один и тот же идентификатор на протяжении всего использования приложений.   -  person Declan McKenna    schedule 04.02.2012
comment
Поля final должны быть установлены к моменту создания вашего объекта, поэтому вы должны установить их в конструкторе. Вы не можете сделать это в объявлении, так как ваш объект еще не готов, плюс методы могут генерировать исключения, которые вы никогда не заметите.   -  person Marcelo    schedule 04.02.2012
comment
Это действительно странно. Учебники и документы по Java в Oracle Я уверен, что видел возможность объявить поле как конечный экземпляр один раз и установить для него значение позже. Единственная проблема - вы не можете сделать это дважды, и вы должны это проверить. Вы случайно не делали это дважды?   -  person Gangnus    schedule 04.02.2012
comment
@Гангус Нет. Я так же предполагал, что могу поставить один раз и не более.   -  person Declan McKenna    schedule 04.02.2012
comment
А какую версию Java вы поставили? Жаль - это была моя последняя надежда.   -  person Gangnus    schedule 04.02.2012
comment
@Gangnus Из WP: переменная final может быть инициализирована только один раз либо с помощью инициализатора, либо с помощью оператора присваивания. Его не нужно инициализировать в точке объявления: это называется пустой финальной переменной. Пустая конечная переменная экземпляра класса должна быть обязательно назначена в конце каждого конструктора класса, в котором она объявлена ​​(...)   -  person Marcelo    schedule 04.02.2012
comment
Самый последний, я потерял номера версий, но я обновил его на прошлой неделе. Это позор, потому что основное время, когда я хотел бы использовать константы, было бы заменить громоздкие вызовы методов.   -  person Declan McKenna    schedule 04.02.2012


Ответы (4)


Является ли использование констант здесь хорошей идеей?

Нет. Лучше подпрограмма, которая считывает значение из ресурсов:

public class ImageUtils {

   private static int empty = -1;

   public static int getEmpty(Context context) {
        if(empty == -1)
          empty = context.getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");

        return empty;
   }

}
person onof    schedule 03.02.2012
comment
Это, просто убедитесь, что метод кэширует значение, а не читает из файла каждый раз. - person Marcelo; 04.02.2012
comment
Какие преимущества это имеет по сравнению с простым удалением «final» из int? - person Declan McKenna; 04.02.2012
comment
это статично и может вызываться отовсюду - person onof; 04.02.2012

Невозможно загрузить ресурсы в константы.

Я уже сделал поиск по этому вопросу и спросил вопрос вот по этому поводу - ни за что.

Посмотрите на это так - они уже константы. Итак, вы могли бы разместить их на моем сайте, если эффективность не является проблемой. Или загрузить их в переменные. Это печально, не так ли?

person Gangnus    schedule 03.02.2012
comment
Было бы хорошо просто реализовать это как обычный/переменный int? - person Declan McKenna; 04.02.2012
comment
Да, я сам так пользуюсь. Но я использую его для сложных структур и, увидев эти фрагменты кода в Oracle, надеялся, что в более простых случаях я смогу использовать final. Теперь вы убили, нет, вы убили ту надежду:..( - person Gangnus; 04.02.2012

Первый не работает, потому что вы пытаетесь вызвать методы своего класса до его создания. Второй не работает, потому что вы не инициализируете свою окончательную переменную при построении. (Это нужно сделать в определении или в конструкторе). Сделайте вашу операцию getResource статическим методом другого класса (что-то вроде ResourceUtilities.getResources()), и это должно заставить ее работать.

person Dodd10x    schedule 03.02.2012

Создайте класс приложения. См. пример здесь. Затем используйте его. как это:

private final int EMPTY = App.getContext().getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");
person Dmytro Danylyk    schedule 03.02.2012