Object yang lahir dalam keadaan setengah jadi — nama terisi, NIM kosong, IPK belum masuk akal — adalah undangan bug. Constructor adalah garis pertahanan pertama: method istimewa yang berjalan otomatis pada saat instansiasi, tepat ketika data object pertama kali terbentuk. Di sanalah kita menempatkan nilai default, input wajib, dan validasi paling awal. Pada chapter ini kita membangun constructor class Mahasiswa yang menolak input tidak valid sebelum object sempat tercipta. Cakupan materi:
- anatomi constructor dan momen pemanggilannya
- input wajib vs opsional dengan
nargin - pola “validasi dulu, isi kemudian” dengan
error() - kebiasaan constructor sehat dan yang harus dihindari
Method yang Bernama Sama dengan Class #
Aturannya: constructor adalah method yang namanya persis sama dengan nama class, dideklarasikan hanya dalam blok methods biasa, dan variabel outputnya adalah obj. Mekanisme di balik layar: begitu ekspresi Mahasiswa('Budi', 'M2311001', 3.45) dievaluasi, MATLAB membuat object kosong, menjalankan constructor milik Mahasiswa, lalu mengikat object hasilnya ke variabel di sisi kiri. Jika constructor berakhir dengan error(), object tidak jadi dihasilkan — assignment tidak pernah terjadi dan workspace tetap bersih dari data setengah jadi.
Dua aturan bawaan MATLAB mempermudah hidup kita. Pertama, constructor tidak wajib — class Sensor pada Chapter Properties hanya berisi blok properties, tetap bisa diinstansiasi; nilai default property yang bekerja. Kedua, constructor hanya boleh mengembalikan object class-nya sendiri; MATLAB menolak constructor yang mencoba mengembalikan tipe lain.
Input Wajib, Opsional, dan Default #
Constructor sering perlu dipanggil dalam beberapa bentuk: lengkap, sebagian, atau kosong. Pola standarnya memakai nargin — jumlah argumen yang benar-benar dikirim pemanggil:
function obj = Mahasiswa(nama, nim, ipk)
if nargin < 2
error('Mahasiswa:argumenKurang', ...
'Butuh minimal nama dan NIM.');
end
if nargin < 3
ipk = 0; % nilai default argumen ketiga
end
...
endMekanismenya: parameter yang tidak dikirim pemanggil tidak berisi apa pun, sehingga pemeriksaan nargin < 3 menjadi titik pemasangan default. Constructor Mahasiswa menetapkan nama dan NIM sebagai input wajib (kurang dari dua ditolak), sedangkan IPK opsional dengan default 0 — mahasiswa baru memang belum punya IPK. Constructor boleh juga tanpa syarat sama sekali, seperti RekeningBank() pada chapter sebelumnya yang jatuh ke 'Tanpa Nama' dan saldo 0.
Validasi Dulu, Isi Kemudian #
Pola paling penting pada bab ini urutannya: seluruh pemeriksaan selesai sebelum satu property pun diisi. Validasi input memakai pola nargin + error() dari Chapter Function Validation — identifier galat, pesan jelas, program berhenti di tempat:
if ~ischar(nama) || isempty(strtrim(nama))
error('Mahasiswa:namaTidakValid', ...
'nama harus teks non-kosong.');
end
...
% seluruh validasi lolos, baru mengisi
obj.nama = nama;
obj.nim = nim;
obj.ipk = ipk;Mengapa urutan ini penting? Karena error() menghentikan constructor seketika — property yang belum diisi tidak pernah terisi setengah. Jika kita mengisi dulu lalu memvalidasi, object sempat berada dalam keadaan tidak sah selama beberapa baris, dan pembaca kode harus melacak keadaan mana yang sudah divalidasi. Constructor yang mengikuti pola ini menjamin satu hal kepada seluruh pengguna class: object yang berhasil diciptakan selalu valid.
Pola Constructor Sehat #
Constructor yang baik ramping dan tegas. Tabel berikut merangkum kebiasaan yang layak dipertahankan dan yang sebaiknya dihindari:
| Lakukan | Hindari |
|---|---|
| Validasi seluruh input di baris-baris awal | Mengisi property sebelum validasi selesai |
| Default yang bermakna untuk input opsional | Menebak-nebak nilai penting (nim = '???') |
| Mengerjakan inisialisasi ringan property | Membaca berkas besar / mengunduh data di constructor |
Menolak input salah dengan error() + pesan jelas | Melanjutkan dengan nilai rusak dan berharap untung |
| Membiarkan constructor kosong bila tak ada yang perlu diatur | Menaruh seluruh logika program di dalam constructor |
Poin “jangan kerja berat” layak ditegaskan: constructor berjalan setiap kali object dibuat. Jika constructor membaca berkas 500 MB, membuat 10.000 object berarti membaca berkas itu 10.000 kali. Beratnya pekerjaan sebaiknya dipindah ke method yang dipanggil eksplisit, atau ke lazy initialization lewat accessor get pada property dependent.
Contoh Lengkap: Mahasiswa #
Class Mahasiswa menerapkan seluruh pola di atas — validasi tiga lapis (jumlah argumen, tipe teks, rentang IPK) lalu pengisian property:
classdef Mahasiswa
%MAHASISWA Data mahasiswa dengan constructor tervalidasi.
properties
nama
nim
ipk = 0
end
methods
function obj = Mahasiswa(nama, nim, ipk)
% --- validasi dulu ---
if nargin < 2
error('Mahasiswa:argumenKurang', ...
'Butuh minimal nama dan NIM.');
end
if ~ischar(nama) || isempty(strtrim(nama))
error('Mahasiswa:namaTidakValid', ...
'nama harus teks non-kosong.');
end
if ~ischar(nim) || isempty(strtrim(nim))
error('Mahasiswa:nimTidakValid', ...
'NIM harus teks non-kosong.');
end
if nargin < 3
ipk = 0; % nilai default argumen ketiga
end
if ~isscalar(ipk) || ~isnumeric(ipk) || ipk < 0 || ipk > 4
error('Mahasiswa:ipkTidakValid', ...
'ipk harus skalar dalam rentang 0..4.');
end
% --- isi properties setelah lolos validasi ---
obj.nama = nama;
obj.nim = nim;
obj.ipk = ipk;
end
function tampilkan(obj)
fprintf('%s (%s) IPK %.2f\n', obj.nama, obj.nim, obj.ipk);
end
end
endMari kita bedah baris-baris kode di atas:
- Baris 9 (
function obj = Mahasiswa(nama, nim, ipk)): nama method sama persis dengan nama class — itulah tanda constructor; output selaluobj. - Baris 11-14 (
if nargin < 2 ... error(...)): pagar jumlah argumen — nama dan NIM wajib; pelanggaran dihentikan sebelum property tersentuh. - Baris 15-22 (
~ischar(nama) ...,~ischar(nim) ...): validasi tipe dan isi —strtrimmemastikan teks spasi murni tetap dianggap kosong. - Baris 23-25 (
if nargin < 3): titik pemasangan default — IPK mahasiswa baru memang 0. - Baris 26-29 (
if ~isscalar(ipk) ... ipk > 4): validasi nilai — IPK 7 ditolak dengan pesan yang menyebut rentang sahnya. - Baris 30-33 (
obj.nama = nama; ...): pengisian property baru terjadi setelah seluruh pagar lolos — object tidak pernah berhenti di keadaan setengah valid.
Skrip uji_Mahasiswa.m menguji dua pemanggilan sah dan tiga penolakan lewat try/catch:
% uji_Mahasiswa.m - menguji constructor class Mahasiswa
m1 = Mahasiswa('Budi Santoso', 'M2311001', 3.45);
m1.tampilkan();
m2 = Mahasiswa('Siti Aminah', 'M2311002'); % ipk memakai default 0
m2.tampilkan();
% input tidak valid ditolak dengan pesan yang jelas
try
Mahasiswa('Budi');
catch err
fprintf('ditolak (argumen kurang) : %s\n', err.message);
end
try
Mahasiswa('Budi', 'M2311003', 7);
catch err
fprintf('ditolak (ipk di luar 0..4) : %s\n', err.message);
end
try
Mahasiswa('', 'M2311004');
catch err
fprintf('ditolak (nama kosong) : %s\n', err.message);
endOutput yang Dihasilkan:
Budi Santoso (M2311001) IPK 3.45
Siti Aminah (M2311002) IPK 0.00
ditolak (argumen kurang) : Butuh minimal nama dan NIM.
ditolak (ipk di luar 0..4) : ipk harus skalar dalam rentang 0..4.
ditolak (nama kosong) : nama harus teks non-kosong.Perhatikan bahwa pemanggilan Mahasiswa('Budi') gagal total — tidak ada object setengah jadi yang tersisa di workspace; try/catch hanya menangkap pesan galat untuk ditampilkan.
Ringkasan #
Constructor adalah method bernama sama dengan class-nya yang berjalan otomatis saat instansiasi dan hanya mengembalikan object class tersebut. Input wajib dijaga dengan nargin, input opsional diberi default bermakna, dan seluruh validasi diselesaikan lewat error() sebelum property pertama diisi — sehingga object yang berhasil lahir selalu berada dalam keadaan valid, dan object yang gagal tidak meninggalkan jejak. Kebiasaan sehatnya: constructor ramping, tanpa I/O berat; pekerjaan besar dipindahkan ke method eksplisit. Berkas Mahasiswa.m dan uji_Mahasiswa.m di bagian bawah halaman memuat implementasi lengkap yang sudah teruji.