Каков наилучший способ определения констант в android, как статический класс, интерфейс или ресурс xml?

Я разрабатываю приложение для Android, которое использует веб-службу для получения данных с сервера, потому что у меня есть три разных набора URL-адресов, чтобы указать систему разработки, тестовый сервер и живой сервер. Трудно изменить URL-адрес, когда я хочу подать заявку на тестирование/жить. поэтому я планировал сделать его как настраиваемым, чтобы приложение могло получить соответствующий URL-адрес на основе константы конфигурации типа сборки. Итак,

  • который является лучшим способом сохранить эти константы, статический класс java или java public interface или файл ресурсов xml.? Когда? Почему?
  • который дает лучшую производительность?, Когда? Почему?

Пример: ресурс 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>

Статическая константа 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"};
}

Ответ 1

Существует большая разница между тем, что вы можете ссылаться на ресурсы проекта в своих XML-макетах. Они доступны в контексте приложения и поэтому доступны в глобальном приложении. Самыми большими преимуществами использования ресурсов проекта является простота доступа и что они позволяют значительно организовать проект.

static final константы компилируются в java-байт-код; ресурсы проекта скомпилированы в двоичный формат в apk. Доступ к ним чрезвычайно эффективен... если есть разница между ними, он не более тривиально.

Существует не установленное правило о том, как вы должны использовать ресурсы/константы в своем проекте. Тем не менее, я лично использую ресурсы для значений, которые мне могут понадобиться использовать в моем XML или Java-коде. С другой стороны, я обычно использую константы static final для значений, которые будут использоваться только моим java-кодом и специфичны для моей реализации.

Также обратите внимание, что можно загружать ресурсы XML во время выполнения в зависимости от текущей конфигурации устройства (то есть размера экрана, локали и т.д.). Поэтому вы должны принять это во внимание при принятии решения о том, следует ли объявлять константу в XML или непосредственно в ваших файлах .java.

Ответ 2

В общем случае:

  • Значения XML имеют преимущество accessbilty в файле макета и файле манифеста над константами в java файле
  • Значения XML имеют преимущество для поддержки нескольких языков над константами в java файле.

Ответ 3

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

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;
}

Теперь мы можем использовать приведенные выше константы следующим образом.

Constant.NOTICE_BUTTON_BLINK_DURATION

Ответ 4

Всегда полезно извлекать строки пользовательского интерфейса из вашего кода приложения и хранить их во внешнем файле. Android упрощает работу с каталогом ресурсов в каждом Android-проекте.

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

Ответ 5

Я думаю, что оба способа кажутся хорошими, но дело в том, что это зависит от ваших требований.

Если у вас есть ваши значения (ссылка на веб-службу) в вашем XML-документе, и предположите, что есть какие-либо изменения в ваших значениях (ссылка на веб-службу), вы можете легко изменить только в XML файле.

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

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

Ответ 6

Я не думаю, что это будет важно для производительности, если честно. В основном это зависит от предпочтения (я предпочитаю использовать статическую переменную в коде).

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

Ответ 7

Я рад, что кто-то спросил об этом... плюс один!

Ресурсы проекта нуждаются в доступе к Контексту, который недоступен в статических методах (если вы не передаете его и т.д.), но всегда доступен в Activity - похоже, предпочтительное соединение между ресурсами и макетами. Для переменных приложения и констант, которые могут обрабатываться статическими методами, я создаю абстрактный класс и статический импорт (этого класса констант) во всех других файлах классов проекта.

ПВС