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:

matlab
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
    ...
end

Mekanismenya: 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:

matlab
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:

LakukanHindari
Validasi seluruh input di baris-baris awalMengisi property sebelum validasi selesai
Default yang bermakna untuk input opsionalMenebak-nebak nilai penting (nim = '???')
Mengerjakan inisialisasi ringan propertyMembaca berkas besar / mengunduh data di constructor
Menolak input salah dengan error() + pesan jelasMelanjutkan dengan nilai rusak dan berharap untung
Membiarkan constructor kosong bila tak ada yang perlu diaturMenaruh 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:

matlab
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
end

Mari kita bedah baris-baris kode di atas:

  1. Baris 9 (function obj = Mahasiswa(nama, nim, ipk)): nama method sama persis dengan nama class — itulah tanda constructor; output selalu obj.
  2. Baris 11-14 (if nargin < 2 ... error(...)): pagar jumlah argumen — nama dan NIM wajib; pelanggaran dihentikan sebelum property tersentuh.
  3. Baris 15-22 (~ischar(nama) ..., ~ischar(nim) ...): validasi tipe dan isi — strtrim memastikan teks spasi murni tetap dianggap kosong.
  4. Baris 23-25 (if nargin < 3): titik pemasangan default — IPK mahasiswa baru memang 0.
  5. Baris 26-29 (if ~isscalar(ipk) ... ipk > 4): validasi nilai — IPK 7 ditolak dengan pesan yang menyebut rentang sahnya.
  6. 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:

matlab
% 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);
end

Output yang Dihasilkan:

text
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.