Jaki jest najlepszy sposób definiowania stałych w systemie Android, klasy statycznej, interfejsu lub zasobu XML?

98

Tworzę aplikację na Androida, która używa usługi sieciowej do pobierania danych z serwera, w tym celu mam trzy różne zestawy adresów URL, które wskazują system rozwoju, serwer testowy i serwer na żywo. Trudno jest zmienić adres URL, gdy chcę oddać aplikację do testowania / opublikowania. więc planowałem uczynić go konfigurowalnym, aby aplikacja mogła uzyskać odpowiedni adres URL w oparciu o stałą konfiguracyjną typu kompilacji. Więc,

  • jaki jest najlepszy sposób na zachowanie tych stałych, statycznej klasy java, publicznego interfejsu java lub pliku zasobów xml.? Kiedy? Czemu?
  • co daje lepszą wydajność ?, Kiedy? Czemu?

Np. Zasób xml

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>

Stała statyczna Java

public class Config {
    public static final int BUILD_TYPE = 0; // 0 - development, 1 - test, 2 - live
    public static final String[] URL_AUTHENTICATION = {"http://development.com/", "http://test.com/", "http://example.com"};
}
Jayabal
źródło
1
Bardzo wątpię, że wydajność będzie tutaj problemem ...
Alex Lockwood
Czy wywołania usługi sieci Web są w jednej klasie, czy w wielu klasach?
Venky
@venky, że w wielu klasach, każda do innego celu, tj. jedna do uwierzytelniania użytkownika, druga do pobierania danych i tak ...
Jayabal

Odpowiedzi:

92

Istnieje duża różnica między nimi, ponieważ w układach XML można odwoływać się do zasobów projektu. Są dostępne w kontekście aplikacji i dlatego są dostępne w całej aplikacji globalnej. Największą zaletą korzystania z zasobów projektowych jest łatwość dostępu oraz to, że pozwalają one znacząco uporządkować projekt.

static finalstałe są wkompilowane w kod bajtowy java; zasoby projektu są kompilowane do formatu binarnego w ramach apk. Dostęp do jednego z nich jest niezwykle skuteczny ... jeśli jest między nimi różnica, jest co najwyżej trywialna.

Nie ma ustalonej reguły, w jaki sposób należy używać zasobów / stałych w projekcie. To powiedziawszy, osobiście używam zasobów dla wartości, których mogę potrzebować w moim kodzie XML lub java. Z drugiej strony zwykle używam static finalstałych dla wartości, które będą używane tylko przez mój kod Java i są specyficzne dla mojej implementacji.

Należy również pamiętać, że możliwe jest ładowanie zasobów XML w czasie wykonywania w zależności od aktualnej konfiguracji urządzenia (tj. Rozmiaru ekranu, lokalizacji itp.). Dlatego powinieneś wziąć to pod uwagę przy podejmowaniu decyzji, czy powinieneś zadeklarować stałą w XML, czy bezpośrednio w swoich .javaplikach.

Alex Lockwood
źródło
zasoby są o wiele łatwiejsze do skonfigurowania w różnych smakach / typach kompilacji
Mam nadzieję, że
@Alex Mam jedną wątpliwość, czy możesz to wyjaśnić: Zaleca się stosowanie mniej statycznych zmiennych, więc jeśli utworzymy plik stały ze zmienną statyczną, czy nie wpłynie to na wydajność naszej aplikacji?
Pallavi
2
Dodatkową kwestią do rozważenia jest to, że jeśli ostatnia stała jest używana w wielu klasach, wszystkie te obiekty będą musiały zostać ponownie skompilowane, jeśli stała zostanie zmieniona. Ale tak nie jest, jeśli stała jest przechowywana jako zasób. Może to być ważna kwestia w przypadku dużego projektu, którego kompilacja zajmuje dużo czasu.
orodbhen
23

Dla ludzi, którzy chcą zobaczyć, jak możemy użyć Class do zdefiniowania naszych stałych i wywołać dowolne miejsce, w którym potrzebujemy.

Constant.java

    package org.nrum.nrum;

/**
 * Created by rajdhami on 5/23/2017.
 */
public class Constant {
    public static final String SERVER = "http://192.168.0.100/bs.dev/nrum";
//    public static final String SERVER = "http://192.168.100.2/bs.dev/nrum";
    public static final String API_END = SERVER + "/dataProvider";
    public static final String NEWS_API = API_END + "/newsApi";
    public static final String BANNER_API = API_END + "/bannerApi/lists";
    public static final String NOTICE_API = API_END + "/noticeApi/lists";
    public static final String UPLOAD_PATH = SERVER + "/uploads";
    public static final String UPLOAD_PATH_BANNER = UPLOAD_PATH + "/company_1/banner";
    public static final String UPLOAD_PATH_NEWS = UPLOAD_PATH + "/company_1/news";
    public static final int BANNER_TRANSITION_DURATION = 5000;
    public static final int NOTICE_BUTTON_BLINK_DURATION = 5000;
    public static final int BANNER_FETCH_LIMIT = 3;
}

Teraz możemy użyć powyższych stałych w następujący sposób.

Constant.NOTICE_BUTTON_BLINK_DURATION
Mahen
źródło
1
Zadano pytanie o najlepszy sposób !!
shadygoneinsane
@Umar Chcę używać innej roli Inny Inny URL, proszę o pomoc, wcześniej używałem tego samego co urs
Kuldeep Singh
11

W ogólnym przypadku:

  • Wartości XML mają tę zaletę, że accessbilty w pliku układu i pliku manifestu mają przewagę nad stałymi w pliku java
  • Wartości XML mają tę przewagę, że obsługują wiele języków niż stałe w pliku java
Dheeresh Singh
źródło
1
dziękuję Dheeresh, rozumiem, bardzo przydatne jest zachowanie konfiguracji w XML, do której mają dostęp oba układy, manifest i java
Jayabal
2

Zawsze dobrze jest wyodrębnić ciągi znaków interfejsu użytkownika z kodu aplikacji i przechowywać je w pliku zewnętrznym. Android ułatwia to dzięki katalogowi zasobów w każdym projekcie systemu Android.

http://developer.android.com/training/basics/supporting-devices/languages.html

Samir Mangroliya
źródło
Pytanie dotyczy stałych, które mają być używane wewnętrznie tylko przez kod Java. To inny scenariusz. W konkretnym przypadku tagów tekstowych należących do interfejsu użytkownika, jak wspomniałeś, nie ma wątpliwości, że właściwym miejscem są zasoby XML projektu Android.
cesargastonec
2

Myślę, że obie opcje wydają się dobre, ale rzecz jest taka, że ​​zależy to od twoich wymagań.

Jeśli masz swoje wartości (łącze do usługi internetowej) w swoim XML i przypuszczasz, że nastąpiła jakakolwiek zmiana w Twoich wartościach (łącze do usługi internetowej), możesz łatwo zmienić tylko w pliku XML.

Ale jeśli używasz wewnątrz klas jako zmiennych statycznych, musisz zmienić wszystkie pliki klas.

Więc moja sugestia jest taka, aby oddzielić stałe od pliku źródłowego i umieścić je w zasobach i uzyskać do nich dostęp.

Venky
źródło
1
„można łatwo zmienić tylko w pliku XML”. Jest to tak proste, jak zmiana w pliku Java, aw obu przypadkach będziesz musiał przebudować projekt, więc nie sądzę, żeby to była różnica, zostawmy na boku przewagę.
Fran Marzoa
0

Cieszę się, że ktoś o to zapytał ... plus jeden!

Zasoby projektu wymagają dostępu do kontekstu, który nie jest dostępny w metodach statycznych (chyba że go przekażesz itp.), Ale zawsze jest dostępny w działaniu - wydaje się, że istnieje preferencyjne połączenie między zasobami a układami. Dla zmiennych aplikacji i stałych, które mogą być przetwarzane w metodach statycznych, tworzę klasę abstrakcyjną i wykonuję statyczny import (tej klasy stałych) we wszystkich innych plikach klas projektu.

PVS

PVS
źródło