Как мога да инициализирам този int като константа?

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

Този опит предизвиква принудително затваряне при стартиране.

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

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

Този опит връща грешка „крайните променливи може да не са инициализирани“. Премахването на финала му позволява да работи.

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
@Gangus Не. Предположих същото, че мога да го настроя веднъж и не повече.   -  person Declan McKenna    schedule 04.02.2012
comment
И каква версия на Java си задал? Жалко - това беше последната ми надежда.   -  person Gangnus    schedule 04.02.2012
comment
@Gangnus От WP: Крайна променлива може да бъде инициализирана само веднъж, или чрез инициализатор, или оператор за присвояване. Не е необходимо да се инициализира в точката на деклариране: това се нарича празна крайна променлива. Празна крайна променлива на клас трябва да бъде определено присвоена в края на всеки конструктор на класа, в който е декларирана (...)   -  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