Kebutuhan untuk mengatur (menyimpan, mengambilnya kembali dan memodifikasi) preference pengguna (user) dan data konfigurasi dari suatu aplikasi. Data seperti itu biasanya memiliki sifat:
- Data yang kecil (Spesifikasi API menyaratkan maximum 8192 bytes per value)
- Data yang jarang diakses
- Bukan data penting (critical)
- Data yang penting untuk fungsi dari suatu aplikasi
Tipe data yang dapat disimpan menggunakan Preferences API adalah:
- String
- boolean
- double
- float
- int
- long
- byte array
- 3 Interfaces
- NodeChangeListener
- PreferenceChangeListener
- PreferencesFactory
- 4 Classes
- AbstractPreferences
- NodeChangeEvent
- PreferenceChangeEvent
- Preferences
- 2 Exceptions
- BackingStoreException
- InvalidPreferencesFormatException
- API yang didesain sederhana
- Spesifikasi tidak mendefinisikan di tempat mana data akan disimpan (backing store)
- Memiliki dua kategori preference yaitu User dan System
- Data merupakan pasangan key-value
- Struktur pohon (tree): Tiap node dapat menyimpan data dan atau node lain
- Support callback pada saat ada perubahan pada node (penambahan/penghapusan) atau pada data
- Tidak support transaksi pada saat mengubah data (update bersifat atomic)
- Class terpenting yang sering digunakan adalah class Preferences (Sempatkan untuk membaca dokumentasinya)
- Untuk menyimpan data digunakan method putXXX(key, value) pada class Preferences
- Untuk menggambil data digunakan method getXXX(key, default-value) pada class Preferences
- Jika backing store tidak ada, mengakses data atau mengimport preferences akan menghasilkan BackingStoreException
- Gunakan Preferences.systemNodeForPackage(Class) untuk menyimpan data per-system
- Gunakan Preferences.userNodeForPackage(Class) untuk menyimpan data per-user
- Dibalik layar, class Preferences yang merupakan impleentasi dari AbstractPreferences akan dihasilkan dari class PreferencesFactory
- Class Preferences bertanggung jawab terhadap penyimpanan data
- Pada Windows biasanya default Preference akan menggunakan java.util.prefs.WindowsPreferences yang menggunakan native mothod untuk menyimpan data pada registry
- Pada sistem operasi UNIX-like digunakan java.util.prefs.FileSystemProperties yang menyimpan data pada file
- JVM akan menggunakan PreferencesFactory sesuai dengan property java.util.prefs.PreferenceFactory yang ada pada JVM
- PreferencesFactory dapat diubah dengan cara
- Memberikan command line argument pada saat menjalankan JVM, contoh
java -Djava.util.prefs.PreferencesFactory=com.ejlp.perf.TestPreferencesFactory
- Menambahakan kode sebelum Preferences digunakan:
System.setProperty("java.util.prefs.PreferencesFactory", "DisabledPreferencesFactory");
- Support export-import ke format XML dengan menggunakan method exportNode() atau exportSubtree() dan importPreferences()
- Media penyimpanan:
Pada sistem operasi windows biasaya preferences data disimpan pada Windows Registry yaitu pada:
HKEY_CURRENT_USER\Software\JavaSoft\Prefs (untuk system preferences)
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs (untuk user preferences)
Pada sistem operasi lain dapat berada pada file di direktori home user atau ditempat lain.
Contoh penggunaan:
package net.ejlp.test.prefs;
import java.io.IOException;
import java.util.prefs.*;
public class TestPreferences {
// Preference key
private static final String FONT = "font";
// Membuat Preferences instance menggunakan User Preferences
private static Preferences prefs =
Preferences.userNodeForPackage(TestPreferences.class);
public static void main(String[] args) {
TestPreferences.ambil();
// Simpan data pada Preferences
prefs.put(FONT, "Courier New");
TestPreferences.ambil();
// Tambahkan listerner untuk mengangani perubahan yang terjadi
prefs.addPreferenceChangeListener(new PreferenceChangeListener() {
public void preferenceChange(PreferenceChangeEvent evt) {
System.out.println(
"Perubahan preference terdeteksi pada key = " + evt.getKey() +
", new value = " + evt.getNewValue());
}
});
// Ubah value pada key font sekali lagi
prefs.put(FONT, "Courier");
// Export ke format XML dan tampilkan di layar
try {
prefs.exportNode(System.out);
} catch (IOException e) {
} catch (BackingStoreException e) {
}
}
public static void ambil() {
String font = prefs.get(FONT, "Arial");
System.out.println("Data: Key = " + FONT + ", value = " + font);
}
}
- Bahan bacaan:
JSR-10
Dokumentasi Java API > 1.4
How to Completely Disable Sun Java's 1.4.x Preferences Subsystem