Manakah cara terbaik untuk mendefinisikan konstanta di android, baik kelas statis, antarmuka, atau sumber daya xml?

98

Saya sedang mengembangkan aplikasi android yang menggunakan layanan web untuk mendapatkan data dari server, untuk itu saya memiliki tiga kumpulan URL yang berbeda untuk mengarahkan sistem pengembangan, server pengujian, dan server langsung. Sulit untuk mengubah URL setiap kali saya ingin memberikan aplikasi untuk pengujian / live. jadi saya berencana membuatnya sebagai dapat dikonfigurasi, sehingga aplikasi bisa mendapatkan URL yang sesuai berdasarkan saya membangun jenis konfigurasi konstan. Begitu,

  • yang merupakan cara terbaik untuk menjaga konstanta ini, kelas statis java atau antarmuka publik java atau file sumber daya xml.? Kapan? Mengapa?
  • mana yang memberikan kinerja lebih baik ?, Kapan? Mengapa?

Contoh: sumber daya 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>

Konstanta statis 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
sumber
1
Saya sangat meragukan kinerja akan menjadi masalah di sini ...
Alex Lockwood
Apakah panggilan Layanan Web dalam satu kelas atau beberapa kelas?
Venky
@venky, bahwa dalam beberapa kelas, masing-masing untuk tujuan yang berbeda yaitu satu untuk otentikasi pengguna yang lain untuk mengunduh data dan sebagainya ..
Jayabal

Jawaban:

92

Ada perbedaan besar di antara keduanya karena Anda dapat merujuk sumber daya proyek dalam tata letak XML Anda. Mereka tersedia dalam konteks aplikasi dan oleh karena itu dapat diakses di seluruh aplikasi global. Keuntungan terbesar menggunakan sumber daya proyek adalah kemudahan akses dan memungkinkan Anda mengatur proyek secara signifikan.

static finalkonstanta dikompilasi ke dalam bytecode java; sumber daya proyek dikompilasi ke dalam format biner dalam apk. Mengakses keduanya sangat efisien ... jika ada perbedaan di antara keduanya, paling tidak itu sepele.

Tidak ada aturan yang ditetapkan tentang bagaimana Anda harus menggunakan sumber daya / konstanta dalam proyek Anda. Karena itu, saya pribadi menggunakan sumber daya untuk nilai yang mungkin perlu saya gunakan dalam kode XML atau java saya. Di sisi lain, saya biasanya menggunakan static finalkonstanta untuk nilai yang hanya akan digunakan oleh kode java saya dan khusus untuk implementasi saya.

Perhatikan juga bahwa dimungkinkan untuk memuat sumber daya XML pada waktu proses tergantung pada konfigurasi perangkat saat ini (yaitu ukuran layar, lokal, dll.). Jadi, Anda harus mempertimbangkan hal ini saat memutuskan apakah Anda harus mendeklarasikan konstanta dalam XML atau langsung di .javafile Anda .

Alex Lockwood
sumber
sumber daya jauh lebih mudah untuk dikonfigurasi dalam berbagai rasa / tipe build
Semoga
@Alex Saya punya satu keraguan, bisakah Anda menghapusnya: Disarankan untuk menggunakan variabel statis lebih sedikit, jadi jika kita membuat file konstan dengan variabel statis, apakah itu tidak akan mempengaruhi kinerja aplikasi kita?
Pallavi
2
Hal tambahan yang perlu dipertimbangkan adalah, jika konstanta akhir digunakan di beberapa kelas, semua objek tersebut perlu dikompilasi ulang jika konstanta diubah. Namun tidak demikian halnya jika konstanta disimpan sebagai sumber daya. Ini bisa menjadi pertimbangan penting untuk proyek besar yang membutuhkan waktu lama untuk dikompilasi.
orodbhen
23

Untuk orang-orang yang ingin melihat bagaimana kita dapat menggunakan Kelas untuk mendefinisikan konstanta kita dan memanggil apapun yang kita butuhkan.

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

Sekarang kita bisa menggunakan konstanta di atas dengan cara berikut.

Constant.NOTICE_BUTTON_BLINK_DURATION
Mahen
sumber
1
Pertanyaan ditanyakan untuk cara terbaik !!
shadygoneinsane
@Umar Saya ingin menggunakan peran berbeda Berbeda URL berbeda, tolong bantu ,, sebelumnya saya menggunakan yang sama seperti kami
Kuldeep Singh
11

Secara umum:

  • Nilai XML memiliki keunggulan aksesibilitas dalam file tata letak dan file manifes dibandingkan Konstanta dalam file java
  • Nilai XML memiliki keunggulan untuk dukungan multi bahasa dibandingkan Konstanta dalam file java
Dheeresh Singh
sumber
1
terima kasih Dheeresh, ya saya mengerti, sangat berguna untuk menyimpan konfigurasi dalam xml yang diakses oleh tata letak, manifes, dan java
Jayabal
2

Itu selalu merupakan praktik yang baik untuk mengekstrak string UI dari kode aplikasi Anda dan menyimpannya di file eksternal. Android mempermudah ini dengan direktori resource di setiap project Android.

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

Samir Mangroliya
sumber
Pertanyaannya adalah tentang konstanta yang akan digunakan secara internal hanya oleh kode Java. Ini adalah skenario yang berbeda. Untuk kasus tertentu dari tag teks yang termasuk dalam antarmuka pengguna, seperti yang Anda sebutkan, tidak ada keraguan bahwa tempat yang tepat adalah sumber daya XML dari proyek Android.
cesargastonec
2

Saya pikir kedua cara tampaknya baik tetapi hal itu tergantung pada kebutuhan Anda.

Jika Anda memiliki nilai Anda (tautan layanan web) dalam XML Anda dan anggap ada perubahan dalam nilai Anda (tautan layanan web), Anda dapat dengan mudah mengubah hanya dalam file XML.

Tetapi jika Anda menggunakan kelas di dalam sebagai variabel statis, Anda harus mengubah semua file kelas.

Jadi saran saya adalah pisahkan konstanta dari file sumber dan masukkan ke sumber daya dan akses ..

Venky
sumber
1
"Anda dapat dengan mudah mengubah hanya dalam file XML" Ini semudah mengubahnya dalam file Java, dan dalam kedua kasus Anda harus membangun kembali proyek, jadi menurut saya itu bukan perbedaan, selain keuntungan.
Fran Marzoa
0

Saya senang seseorang menanyakan ini ... plus satu!

Sumber daya proyek memerlukan akses ke Konteks, yang tidak tersedia dalam metode statis (kecuali Anda meneruskannya di dll.), Tetapi selalu tersedia di Aktivitas - tampaknya ada koneksi preferensial antara sumber daya dan tata letak. Untuk variabel dan konstanta aplikasi yang dapat diproses dalam metode statis, saya membuat kelas abstrak dan melakukan impor statis (dari kelas konstanta ini) di semua file kelas proyek lainnya.

PVS

PVS
sumber