Aksesor set adalah satu pintu yang dilewati setiap penugasan property. Pintu inilah tempat paling tepat untuk memeriksa nilai sebelum disimpan. Pada section Exception Handling kita sudah mengenal throw dan try/catch; bab ini menggabungkan keduanya dengan property agar data class tidak pernah berisi nilai yang melanggar aturan.

Masalah: Nilai Tidak Valid Masuk Lewat Penugasan #

Class Barang menyimpan harga yang tidak boleh negatif. Bila aksesor set menyalin value tanpa pemeriksaan, satu penugasan barang.Harga = -5000; sudah cukup membuat data tidak sah. Pemeriksaan yang diletakkan di kode pemanggil tidak dapat diandalkan, karena setiap pemanggil baru harus mengingat aturan yang sama. Validasi harus berada di dalam class, tepat di aksesor yang menerima nilai.

Mekanisme Validasi di Aksesor set #

Validasi property mengikuti tiga langkah di dalam aksesor set:

  • Periksa value terhadap aturan class, misalnya harga tidak boleh di bawah nol.
  • Bila aturan dilanggar, lemparkan ArgumentException dengan pesan yang menjelaskan pelanggaran tersebut.
  • Bila aturan terpenuhi, salin value ke backing field; penugasan yang ditolak tidak mengubah nilai lama sedikit pun.

Karena setiap penugasan melewati aksesor yang sama, tidak ada jalur lain yang dapat memasukkan nilai tidak valid.

Contoh: Harga yang Ditolak #

csharp
public class Barang
{
    private int harga;

    public string Nama { get; set; }

    public int Harga
    {
        get { return harga; }
        set
        {
            if (value < 0)
            {
                throw new ArgumentException("Harga tidak boleh negatif.");
            }
            harga = value;
        }
    }
}

Barang barang = new Barang();
barang.Nama = "Tas Ransel";
barang.Harga = 175000;
Console.WriteLine($"{barang.Nama}: Rp{barang.Harga}");

try
{
    barang.Harga = -5000;
}
catch (ArgumentException e)
{
    Console.WriteLine($"Penugasan ditolak: {e.Message}");
}

Console.WriteLine($"Harga tetap: Rp{barang.Harga}");

Output yang Dihasilkan:

text
Tas Ransel: Rp175000
Penugasan ditolak: Harga tidak boleh negatif.
Harga tetap: Rp175000

Mari kita bedah baris demi baris:

  1. if (value < 0): aksesor set memeriksa nilai baru sebelum menyentuh field; value adalah satu-satunya jalur masuk data.
  2. throw new ArgumentException("Harga tidak boleh negatif.");: pelanggaran aturan menghentikan penugasan, dan exception menyampaikan alasannya kepada pemanggil.
  3. harga = value;: baris ini hanya dijalankan bila pemeriksaan lolos, sehingga field harga selalu berisi nilai yang sah.
  4. barang.Harga = -5000; di dalam blok try: penugasan memicu aksesor set, aksesor melempar exception, dan blok catch menangkapnya untuk mencetak pesan penolakan.
  5. Console.WriteLine($"Harga tetap: Rp{barang.Harga}");: pembacaan setelah penolakan menunjukkan harga lama 175000 masih utuh.