Який найкращий спосіб визначити константи в android, статичний клас, інтерфейс чи ресурс xml?


98

Я розробляю додаток для Android, яке використовує веб-сервіс для отримання даних із сервера, для цього я маю три різні набори URL-адрес для системи розробки точок, тестового сервера та реального сервера. Складно змінити URL-адресу, коли я хочу подати заявку на тестування / live. тому я планував зробити його таким, що налаштовується, щоб програма могла отримати відповідну 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файлах.


ресурси набагато простіше налаштовувати в різних варіантах / типах збірки
сподіваємось,

@Alex У мене є один сумнів, чи можете ви це очистити: рекомендується менше використовувати статичні змінні, тому якщо ми створюємо константний файл зі статичною змінною, це не вплине на продуктивність нашого додатку?
Паллаві

2
Додатковим моментом, який слід врахувати, є те, що, якщо кінцева константа використовується в декількох класах, то всі ці об’єкти повинні будуть перекомпільовані, якщо константа змінена. Але це не той випадок, якщо константа зберігається як ресурс. Це може бути важливим фактором для великого проекту, який складається довго.
orodbhen

23

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

Постійна .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 мають перевагу accessbilty у файлі макета та файлі маніфесту перед константами у файлі Java
  • Значення XML мають перевагу у підтримці багатомовності перед константами у файлі Java

1
дякую, Dheeresh, я зрозумів, дуже корисно зберігати конфігурацію в xml, до якої мають доступ як макети, маніфест, так і java
Jayabal

2

Завжди корисно витягувати з коду програми рядки інтерфейсу користувача та зберігати їх у зовнішньому файлі. Android полегшує це завдяки каталогу ресурсів у кожному проекті Android.

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


Питання полягає в константах, які використовуються внутрішньо лише кодом Java. Це інший сценарій. Для конкретного випадку текстових тегів, що належать користувацькому інтерфейсу, як ви вже згадували, безсумнівно, що правильним місцем є XML-ресурси проекту Android.
cesargastonec

2

Я думаю, що обидва шляхи здаються хорошими, але справа в тому, що це залежить від ваших вимог.

Якщо у вас є свої значення (посилання на веб-службу) у вашому XML, і ви вважаєте, що у ваших значеннях є якісь зміни (посилання на веб-службу), ви можете легко змінити їх лише у файлі XML.

Але якщо ви використовуєте всередині класів як статичні змінні, вам доведеться змінити всі файли класів.

Тож моя пропозиція полягає в тому, щоб відокремити константи від вихідного файлу, помістити їх у ресурс і отримати до нього доступ ..


1
"Ви можете легко змінити лише файл XML" Це так само просто, як змінити його у файлі Java, і в обох випадках вам потрібно буде перебудувати проект, тому я не думаю, що це різниця, не кажучи про перевагу.
Fran Marzoa

0

Я рада, що хтось запитав це ... плюс один!

Ресурси проекту потребують доступу до контексту, який недоступний у статичних методах (якщо ви не передаєте його тощо), але завжди доступний у Activity - здається, існує пільговий зв’язок між ресурсами та макетами. Для змінних та констант програми, які можуть оброблятися статичними методами, я створюю абстрактний клас і роблю статичний імпорт (цього класу констант) у всіх інших файлах класу проекту.

ПВС

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.