Properti

Prosedur Property dengan Get dan Set serta properti otomatis satu baris.

Daftar isi

Properti (property) adalah anggota kelas yang dibaca dan ditulis seperti field, tetapi setiap aksesnya dieksekusi sebagai prosedur. Topik ini membahas deklarasi Property dengan blok Get dan Set, pemanfaatan Set untuk validasi, properti otomatis satu baris, serta properti hanya-baca yang nilainya dihitung. Contoh yang dijalankan adalah kelas PenilaianPelajaran yang menjaga rentang nilai ujian, sehingga perbedaan perilaku field biasa dan properti terlihat langsung dari keluaran programnya.

Prosedur Property dan hubungannya dengan field#

Sebuah properti terdiri atas nama, tipe, dan satu atau dua blok akses, yaitu Get yang berjalan ketika properti dibaca serta Set yang berjalan ketika properti ditugaskan. Dari sisi pemanggil, penulisan objek.Nilai = 80 dan objek.Nilai terlihat persis seperti penugasan dan pembacaan variabel. Dari sisi kelas, kedua akses tersebut adalah pemanggilan prosedur, sehingga kode apa pun boleh diletakkan di dalamnya, termasuk validasi, pencatatan, maupun perhitungan.

Kemampuan itu menjadi alasan utama memilih properti daripada membuka field secara langsung. Field biasa menyimpan nilai apa adanya tanpa kesempatan memeriksa apa pun, sedangkan properti menyisipkan pintu yang selalu dilewati. Nilai yang diperiksa pada satu tempat berarti aturan rentang, satuan, maupun formatnya ditegakkan secara konsisten untuk seluruh program. Properti biasanya bekerja bersama field Private yang menampung nilai sesungguhnya, dan field penampung semacam ini disebut backing field.

Nama properti mengikuti konvensi PascalCase seperti metode kelas, sedangkan tipenya dinyatakan dengan klausa As di akhir baris deklarasinya. Sifat baca-tulisnya ditentukan oleh blok yang disertakan, yaitu baca-tulis apabila Get dan Set keduanya ada, hanya-baca apabila hanya Get, dan hanya-tulis apabila hanya Set. Bentuk hanya-tulis jarang digunakan karena keadaan yang dapat diisi tetapi tidak pernah dapat dibaca sulit dipertanggungjawabkan. Karena itu, kombinasi dua blok menjadi pilihan bawaan yang paling lazim.

Properti lengkap dengan Get dan Set#

Kelas PenilaianPelajaran berikut memuat dua bentuk properti sekaligus, yaitu properti otomatis untuk nama pelajaran dan properti lengkap untuk nilai. Properti Nilai menjaga field nilaiSaatIni agar selalu berada pada rentang 0 sampai 100, sedangkan properti Lulus sengaja dibuat hanya-baca karena hasilnya dihitung dari field tersebut.

vb Program.vb
Class PenilaianPelajaran

    Private nilaiSaatIni As Integer

    ' properti otomatis: compiler membuat field penampungnya secara diam-diam
    Public Property NamaPelajaran As String

    ' properti hanya-baca yang dihitung dari field
    Public ReadOnly Property Lulus As Boolean
        Get
            Return nilaiSaatIni >= 75
        End Get
    End Property

    ' properti lengkap dengan validasi pada prosedur Set
    Public Property Nilai As Integer
        Get
            Return nilaiSaatIni
        End Get
        Set(value As Integer)
            If value < 0 OrElse value > 100 Then
                Console.WriteLine($"Penugasan {value} ditolak karena di luar rentang 0 sampai 100")
            Else
                nilaiSaatIni = value
            End If
        End Set
    End Property

End Class

Module Program

    Sub Main()
        Dim matematika As New PenilaianPelajaran()
        matematika.NamaPelajaran = "Matematika"
        matematika.Nilai = 80

        Dim bahasa As New PenilaianPelajaran()
        bahasa.NamaPelajaran = "Bahasa Indonesia"
        bahasa.Nilai = 60

        Console.WriteLine($"{matematika.NamaPelajaran}: nilai {matematika.Nilai}, lulus = {matematika.Lulus}")
        Console.WriteLine($"{bahasa.NamaPelajaran}: nilai {bahasa.Nilai}, lulus = {bahasa.Lulus}")

        bahasa.Nilai = 155
        Console.WriteLine($"{bahasa.NamaPelajaran}: nilai tetap {bahasa.Nilai}")
    End Sub

End Module
text Keluaran
Matematika: nilai 80, lulus = True
Bahasa Indonesia: nilai 60, lulus = False
Penugasan 155 ditolak karena di luar rentang 0 sampai 100
Bahasa Indonesia: nilai tetap 60

Baris bahasa.Nilai = 155 menunjukkan perbedaan pokok properti dan field. Penugasan itu sah secara sintaks dan program tetap berjalan, tetapi prosedur Set memeriksa nilai argumennya dan menolak angka di luar rentang, sehingga field nilaiSaatIni tidak pernah berubah. Baris terakhir keluaran membuktikan keadaan objek masih utuh, yaitu nilai tetap 60. Apabila Nilai ditulis sebagai field biasa, angka 155 akan tersimpan tanpa peringatan apa pun dan status kelulusan menjadi menyesatkan.

Parameter value pada Set otomatis tersedia di dalam bloknya dan memuat nilai yang dikirim pemanggil. Tipe parameternya sama dengan tipe properti, sehingga pemeriksaan value < 0 OrElse value > 100 dilakukan pada Integer tanpa konversi tambahan. Blok Get dan Set boleh diberi tingkat akses masing-masing, misalnya Private Set, apabila pembacaan terbuka tetapi penugasan hanya untuk kode internal kelas.

Properti otomatis dan properti hanya-baca#

Apabila properti tidak memerlukan logika apa pun, VB.NET menyediakan bentuk singkat yang disebut properti otomatis (auto-implemented property). Bentuknya satu baris, yaitu Public Property NamaPelajaran As String, tanpa blok Get maupun Set. Compiler tetap membuat backing field untuknya secara diam-diam, sehingga perilakunya setara dengan properti lengkap yang Get dan Set-nya langsung menyalin nilai. Properti NamaPelajaran pada contoh menggunakan bentuk ini karena penugasan nama tidak memerlukan aturan khusus.

Properti hanya-baca dideklarasikan dengan ReadOnly dan hanya memiliki blok Get. Penugasan kepadanya ditolak compiler, dan pesan errornya menyebutkan bahwa properti tersebut bersifat ReadOnly. Properti Lulus memanfaatkan bentuk ini untuk menyembunyikan detail ambang batas 75 di dalam kelas, sementara kode pemanggil cukup membaca statusnya. Nilai properti semacam ini boleh dihitung setiap kali dibaca, sehingga tidak ada risiko statusnya berbeda dari nilai yang mendasarinya.

Properti otomatis juga mendukung nilai awal, misalnya Public Property Jumlah As Integer = 10, dan compiler mengisinya ketika objek dibentuk. Perilaku serupa tidak diperlukan pada properti yang dihitung seperti Lulus, karena hasilnya selalu mengikuti sumber datanya setiap kali dibaca. Oleh karena itu, nilai yang disimpan menggunakan properti biasa atau otomatis, sedangkan nilai yang dihitung dinyatakan sebagai properti ReadOnly tanpa field penampung tambahan.

vb Contoh: penugasan ke properti ReadOnly ditolak compiler
' tidak-dijalankan
Dim status As Boolean = matematika.Lulus  ' sah: properti ReadOnly tetap dapat dibaca
matematika.Lulus = True                    ' error: properti ReadOnly tidak dapat ditugasi

Kapan properti lebih tepat daripada field#

Pilihan antara field dan properti dapat diringkas dalam tabel berikut.

KebutuhanPilihan yang tepat
Data internal kelas tanpa aturan apa punfield Private
Data yang perlu divalidasi ketika ditugaskanproperti dengan blok Set
Nilai yang dihitung dari data lainproperti ReadOnly
Data yang terbuka bagi kode luar tanpa logikaproperti otomatis

Aturan praktisnya, field disediakan untuk kebutuhan internal kelas, sedangkan properti menjadi wajah data yang terbuka ke luar. Properti juga menjaga kompatibilitas pemanggil ketika kebutuhan berubah, karena logika baru dapat ditambahkan ke dalam Get atau Set tanpa mengubah satu baris kode pemanggil sekalipun. Perubahan semacam itu tidak mungkin dilakukan pada field yang sudah terbuka, sebab pemanggilnya sudah terikat pada penugasan langsung.

Kesalahan umum#

Kesalahan pertama adalah memberi nama field dan properti yang hanya berbeda pada huruf besar-kecilnya, misalnya field nilai dan properti Nilai. VB.NET tidak membedakan huruf besar-kecil, sehingga compiler menolak keduanya dengan pesan bahwa nama tersebut sudah dideklarasikan di kelas yang sama. Nama yang sama persis jelas ditolak juga, sehingga pembedaan huruf besar-kecil saja tidak pernah memadai pada VB.NET. Perbaikannya adalah memberi nama yang berbeda secara utuh, seperti nilaiSaatIni untuk field penampungnya.

Kesalahan kedua adalah melakukan validasi di blok Get. Pemeriksaan pada Get hanya menyentuh nilai yang keluar dan tidak mencegah nilai keliru tersimpan, sehingga aturan sebenarnya tidak ditegakkan. Validasi yang berarti selalu dituliskan di blok Set, yaitu pintu masuknya.

Kesalahan ketiga adalah menugaskan properti itu sendiri di dalam blok Set-nya, misalnya menulis Nilai = value pada properti Nilai. Pernyataan itu memanggil Set kembali tanpa henti hingga memori tumpukan habis, dan program berhenti dengan StackOverflowException. Perbaikannya adalah menugaskan backing field-nya, seperti nilaiSaatIni = value pada contoh, karena field tidak memicu prosedur apa pun ketika ditugaskan.

Ringkasan#

  • Properti adalah anggota yang terbaca seperti field tetapi dieksekusi sebagai prosedur, dengan blok Get untuk pembacaan dan blok Set untuk penugasan.
  • Validasi dituliskan pada blok Set melalui parameter value, sehingga keadaan internal objek hanya berubah melalui pintu yang diperiksa.
  • Properti otomatis satu baris memindahkan pembuatan backing field kepada compiler, sedangkan properti ReadOnly hanya menyediakan blok Get untuk nilai yang dihitung.

Referensi#