Property adalah tempat class menyimpan datanya — padanan field pada struct, tetapi dengan kekuatan ekstra: nilai default otomatis, validasi, konstanta, dan nilai yang dihitung on-the-fly. Kekuatan-kekuatan ini menentukan mutu encapsulation: property yang dirancang baik tidak pernah berisi nilai tak masuk akal. Pada chapter ini kita membangun class Suhu yang menyimpan suhu dalam Celsius lalu menghitung Fahrenheit dan Kelvin secara otomatis. Cakupan materi:
- deklarasi property dan nilai default
- dua jalur validasi: sintaksis validasi property dan validasi manual
- atribut
ConstantdanDependent - accessor
get.Propertidanset.Properti
Properties dan Nilai Default #
Aturannya: setiap property dideklarasikan dengan nama di dalam blok properties, dan boleh langsung diberi nilai default. Mekanisme di balik layar: setiap kali object diinstansiasi, MATLAB menyiapkan salinan property lengkap dengan nilainya — object baru tidak pernah berisi “sampah” seperti variabel yang belum diisi. Nilai default harus berupa konstanta atau ekspresi yang bisa dievaluasi saat class dimuat.
classdef Sensor
properties
lokasi = 'gudang'
bacaan = 0
end
end>> s = Sensor()s =
Sensor with properties:
lokasi: 'gudang'
bacaan: 0Property tanpa nilai default berawalan [] — praktik yang baik adalah mengisi semua property yang relevan agar object langsung berada dalam keadaan valid.
Validasi Nilai Property #
MATLAB (R2019b ke atas) menyediakan sintaksis validasi property yang ditempelkan langsung pada deklarasi — satu baris memuat ukuran, kelas, validator, dan nilai default:
properties
celsius (1,1) double {mustBeGreaterThan(celsius, -273.15)} = 25
endAnatomi deklarasi tersebut, dibaca dari kiri ke kanan:
| Bagian | Contoh | Peran |
|---|---|---|
| nama property | celsius | identifier yang diakses lewat obj.celsius |
| ukuran | (1,1) | dimensi yang diharapkan; : berarti bebas |
| kelas | double | tipe yang diterima (atau bisa dikonversi) |
| validators | {mustBeGreaterThan(...)} | pemeriksa tambahan dalam kurung kurawal |
| nilai default | = 25 | dipakai bila constructor tidak mengisi |
Jalur manual bekerja lewat accessor: setiap assignment obj.celsius = nilai yang sah diarahkan MATLAB ke method set.celsius(obj, nilai) milik class — di sanalah kita meletakkan pemeriksaan isnumeric, isscalar, dan batas nilai, lalu menolak pelanggaran dengan error(). Constructor yang mengisi property juga melewati accessor yang sama, sehingga aturan berlaku sejak object pertama kali dibuat.
Constant: Konstanta Milik Class #
Atribut Constant = true menjadikan property konstanta: nilainya milik class, tidak per object, dan dibaca tanpa perlu instansiasi — cukup NamaClass.NamaProperti. Konstanta cocok untuk nilai fisik, batas, atau pengaturan yang sama untuk semua instance:
classdef Suhu
properties (Constant = true)
NOL_MUTLAK = -273.15 % derajat Celsius
end
% ... property dan method lain menyusul pada contoh lengkap
endMekanismenya: nilai konstanta dievaluasi sekali saat class dimuat; seluruh object membaca nilai yang sama dari definisi class. MATLAB menolak assignment ke property Constant dengan galat — konstanta memang tidak boleh ditimpa dari luar maupun dari dalam class. Pada class Suhu, konstanta ini dipakai baik sebagai batas validasi (celsius >= NOL_MUTLAK) maupun sebagai titik nol perhitungan Kelvin.
Dependent Properties dan Accessor get #
Beberapa nilai sebaiknya tidak disimpan karena selalu bisa dihitung dari data lain — menyimpannya membuka risiko tidak sinkron (Celsius diubah, Fahrenheit tertinggal). Atribut Dependent = true menyelesaikannya: property bertanda dependent tidak menyimpan nilai; setiap pembacaan obj.fahrenheit memanggil accessor get.fahrenheit(obj) yang menghitung hasil saat itu juga.
properties (Dependent = true)
fahrenheit
kelvin
end
methods
function f = get.fahrenheit(obj)
f = obj.celsius * 9/5 + 32;
end
endMekanisme di balik layar: obj.fahrenheit berhenti di accessor get, rumus dijalankan, hasil dikembalikan ke pemanggil — memori object hanya menyimpan celsius. Pasangan get/set seperti ini adalah tempat validasi manual bermalam: set.celsius memeriksa nilai masuk, get.fahrenheit menghitung nilai turunan. Property dependent juga menolak assignment dari luar — menulis obj.fahrenheit = 100 tidak bermakna karena tidak ada penyimpanan di belakangnya.
Contoh Lengkap: Class Suhu #
Class Suhu menggabungkan seluruh fitur: konstanta NOL_MUTLAK, property tersimpan celsius, dua property dependent, serta accessor set yang memvalidasi:
classdef Suhu
%SUHU Suhu dengan konversi otomatis ke Fahrenheit dan Kelvin.
properties (Constant = true)
NOL_MUTLAK = -273.15 % derajat Celsius
end
properties
celsius = 25
end
properties (Dependent = true)
fahrenheit
kelvin
end
methods
function obj = Suhu(c)
if nargin > 0
obj.celsius = c; % melewati set.celsius -> tervalidasi
end
end
function obj = set.celsius(obj, nilai)
if ~isnumeric(nilai) || ~isscalar(nilai) || ...
nilai < Suhu.NOL_MUTLAK
error('Suhu:celsiusTidakValid', ...
'celsius harus skalar >= %g (nol mutlak).', ...
Suhu.NOL_MUTLAK);
end
obj.celsius = nilai;
end
function f = get.fahrenheit(obj)
f = obj.celsius * 9/5 + 32;
end
function k = get.kelvin(obj)
k = obj.celsius - Suhu.NOL_MUTLAK;
end
end
endMari kita bedah baris-baris kode di atas:
- Baris 3-5 (
properties (Constant = true)): konstanta dibaca sebagaiSuhu.NOL_MUTLAKtanpa object — dipakai sebagai batas validasi dan titik nol Kelvin. - Baris 6-8 (
celsius = 25): satu-satunya data tersimpan; nilai defaultnya suhu ruang yang wajar. - Baris 9-12 (
properties (Dependent = true)):fahrenheitdankelvindideklarasikan tanpa nilai — keduanya dihitung, bukan disimpan. - Baris 19-27 (
set.celsius): gerbang validasi — tiga syarat (numerik, skalar, di atas nol mutlak) diperiksa sebelumobj.celsiusditimpa; constructor di baris 16 juga melewati gerbang ini. - Baris 28-33 (
get.fahrenheit,get.kelvin): rumus konversi dijalankan setiap kali property dependent dibaca, sehingga Celsius dan Fahrenheit tidak pernah berbeda pendapat.
Skrip uji_Suhu.m menguji nilai default, tiga titik suhu fisik, konstanta class, dan penolakan input di bawah nol mutlak:
% uji_Suhu.m - menguji class Suhu
s = Suhu();
fprintf('default : %g C | %g F | %g K\n', ...
s.celsius, s.fahrenheit, s.kelvin);
s = Suhu(100);
fprintf('air mendidih : %g C | %g F | %g K\n', ...
s.celsius, s.fahrenheit, s.kelvin);
s = Suhu(-40);
fprintf('titik sama : %g C | %g F\n', s.celsius, s.fahrenheit);
s.celsius = 37; % assignment lewat set.celsius
fprintf('suhu badan : %g C | %g F | %g K\n', ...
s.celsius, s.fahrenheit, s.kelvin);
fprintf('konstanta : Suhu.NOL_MUTLAK = %g\n', Suhu.NOL_MUTLAK);
try
s = Suhu(Suhu.NOL_MUTLAK - 10);
catch err
fprintf('ditolak : %s\n', err.message);
endOutput yang Dihasilkan:
default : 25 C | 77 F | 298.15 K
air mendidih : 100 C | 212 F | 373.15 K
titik sama : -40 C | -40 F
suhu badan : 37 C | 98.6 F | 310.15 K
konstanta : Suhu.NOL_MUTLAK = -273.15
ditolak : celsius harus skalar >= -273.15 (nol mutlak).Baris “titik sama” memperlihatkan keuntungan dependent property: -40 adalah satu-satunya suhu yang bernilai sama dalam Celsius dan Fahrenheit — kita tidak perlu menyimpan dua angka untuk membuktikannya.
Ringkasan #
Property dideklarasikan dalam blok properties dengan nilai default yang otomatis terpasang pada setiap object baru. Validasi nilainya punya dua jalur: sintaksis property (1,1) double {mustBe*} = default (MATLAB R2019b+, MATLAB-ONLY) atau validasi manual dalam accessor set.Properti yang juga disusuri constructor. Atribut Constant menyediakan konstanta tingkat class yang dibaca sebagai NamaClass.Properti, sedangkan Dependent menandai property yang dihitung accessor get.Properti setiap kali dibaca — penyimpanan tunggal, tanpa risiko tidak sinkron. Berkas Suhu.m dan uji_Suhu.m di bagian bawah halaman memuat class lengkap yang sudah teruji.