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

98

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

  • Какой лучший способ сохранить эти константы, статический класс Java или открытый интерфейс Java или файл ресурсов 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
Я очень сомневаюсь, что производительность будет здесь проблемой ...
Алекс Локвуд,
Являются ли вызовы веб-службы одним или несколькими классами?
Venky
@venky, это несколько классов, каждый для разных целей, то есть один для аутентификации пользователя, другой для загрузки данных и так далее ..
Jayabal

Ответы:

92

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

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

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

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

Алекс Локвуд
источник
ресурсы намного проще настроить в разных вариантах / типах сборки
HopefullyHelpful
@Alex У меня есть одно сомнение, не могли бы вы прояснить это: рекомендуется меньше использовать статические переменные, поэтому, если мы создадим постоянный файл со статической переменной, это не повлияет на производительность нашего приложения?
Паллави
2
Дополнительный момент, который следует учитывать, заключается в том, что, если конечная константа используется в нескольких классах, тогда все эти объекты необходимо будет перекомпилировать, если константа будет изменена. Но это не так, если константа хранится как ресурс. Это может быть важным соображением для большого проекта, компиляция которого занимает много времени.
orodbhen 05
23

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

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
Махен
источник
1
Вопрос был задан как лучше !!
shadygoneinsane
@Umar Я хочу использовать разные роли Разные разные URL, пожалуйста, помогите, до этого я использовал то же, что и urs
Kuldeep Singh
11

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

  • Значения XML имеют преимущество доступа к файлу макета и файлу манифеста над константами в файле java.
  • Значения XML имеют преимущество в многоязыковой поддержке над константами в файле java.
Диреш Сингх
источник
1
спасибо, Дхереш, я понял, очень полезно сохранять конфигурацию в xml, к которому обращаются оба макета, манифест и java
Jayabal
2

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

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

Самир Мангролия
источник
Речь идет о константах, которые будут использоваться внутри только Java-кодом. Это другой сценарий. Как вы упомянули, в конкретном случае текстовых тегов, принадлежащих пользовательскому интерфейсу, нет никаких сомнений в том, что правильным местом являются ресурсы XML проекта Android.
cesargastonec
2

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

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

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

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

Venky
источник
1
«вы можете легко изменить только в файле XML» Это так же просто, как изменить его в файле Java, и в обоих случаях вам нужно будет пересобрать проект, поэтому я не думаю, что это разница, не говоря уже о преимуществе.
Fran Marzoa
0

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

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

ПВС

ПВС
источник