Saturday, February 11, 2006

Ganti java.util.Properties dengan Preferences API

Tujuan utama dibuatnya Preferences API:

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
Untuk memenuhi kebutuhan tersebut biasanya programmer menggunakan file properties (file text) yang diakses lewat API java.util.Properties. Dengan adanya API ini, java.util.Properties menjadi tergantikan.

Tipe data yang dapat disimpan menggunakan Preferences API adalah:
  • String
  • boolean
  • double
  • float
  • int
  • long
  • byte array
API ini terdiri dari:

  • 3 Interfaces
    • NodeChangeListener
    • PreferenceChangeListener
    • PreferencesFactory
  • 4 Classes
    • AbstractPreferences
    • NodeChangeEvent
    • PreferenceChangeEvent
    • Preferences
  • 2 Exceptions
    • BackingStoreException
    • InvalidPreferencesFormatException
- API ini ada mulai pada Java versi 1.4 pada package java.util.prefs
- 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

Followers