Menu
CoddyTech

Keamanan Null dalam class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 28 dari 110.

Saat merancang class, kamu perlu menentukan field mana yang wajib dan mana yang opsional. Keamanan null memengaruhi cara kamu mendeklarasikan variabel instans dan menulis konstruktor.

Field yang tidak boleh bernilai null harus diinisialisasi sebelum isi konstruktor dijalankan. Kamu dapat melakukannya melalui daftar inisialisasi, parameter konstruktor, atau nilai default:

class User {
  String name;           // Harus diinisialisasi
  String? bio;           // Opsional, boleh bernilai null
  int age = 0;           // Memiliki nilai bawaan
  
  User(this.name);       // name diinisialisasi melalui parameter
}

Untuk field yang nullable, kamu bisa membiarkannya tanpa inisialisasi karena nilai default-nya adalah null. Ini berguna untuk data opsional:

class Product {
  String title;
  String? description;   // Deskripsi produk opsional
  double? discount;      // Secara default, tidak ada diskon
  
  Product(this.title);
}

var item = Product('Laptop');
print(item.description);  // null
print(item.discount);     // null

Saat mengakses field yang bisa bernilai null, gunakan operator yang memahami null yang sudah kamu pelajari:

class Order {
  String id;
  User? customer;
  
  Order(this.id);
  
  String getCustomerName() {
    return customer?.name ?? 'Guest';
  }
}

Kata kunci required pada parameter bernama memastikan pemanggil memberikan nilai penting:

class Account {
  String email;
  String? phone;
  
  Account({required this.email, this.phone});
}

var acc = Account(email: 'test@mail.com');  // phone bersifat opsional

Dengan memilih field nullable dan non-nullable secara cermat, kamu membuat class yang menyampaikan dengan jelas data mana yang wajib dan mana yang opsional.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pemesanan hotel yang menunjukkan cara merancang class dengan perpaduan yang cermat antara field wajib dan opsional menggunakan keamanan null.

Kamu akan mengatur kodemu ke dalam dua file:

  • reservation.dart: Definisikan class Reservation yang merepresentasikan pemesanan hotel. Setiap pemesanan memerlukan informasi penting tertentu, tetapi beberapa detail merupakan tambahan opsional yang mungkin diberikan atau tidak diberikan oleh tamu. Class-mu harus memiliki:
    • String guestName yang tidak dapat bernilai null: setiap pemesanan harus memiliki nama tamu
    • int roomNumber yang tidak dapat bernilai null: setiap pemesanan harus memiliki nomor kamar
    • int nights yang tidak dapat bernilai null dengan nilai default 1: masa inap minimum adalah satu malam
    • String? specialRequests yang dapat bernilai null: tamu mungkin memiliki permintaan khusus
    • DateTime? checkInTime yang dapat bernilai null: waktu kedatangan yang tepat mungkin belum diketahui
    • Sebuah constructor yang menggunakan parameter bernama dengan required untuk guestName dan roomNumber, sedangkan nights harus opsional dengan nilai defaultnya
    • Sebuah method getRequestsSummary() yang mengembalikan permintaan khusus jika diberikan, atau 'No special requests' menggunakan operator ??
    • Sebuah method getArrivalInfo() yang mengembalikan representasi string waktu check-in menggunakan ?., atau null jika belum diatur
    • Sebuah method printConfirmation() yang menampilkan detail pemesanan
  • main.dart: Impor class pemesananmu dan buat pemesanan yang menunjukkan berbagai kombinasi data wajib dan opsional:
    • Buat pemesanan untuk tamu 'Sarah Johnson' di kamar 101 selama 3 malam, dengan permintaan khusus 'Late checkout' dan waktu check-in diatur ke DateTime(2024, 6, 15, 14, 30)
    • Buat pemesanan untuk tamu 'Mike Chen' di kamar 205 (gunakan jumlah malam default), dengan hanya permintaan khusus yang diatur ke 'Extra pillows'
    • Buat pemesanan untuk tamu 'Emma Davis' di kamar 310 selama 2 malam (biarkan kedua field opsional bernilai null)
    • Untuk setiap pemesanan secara berurutan, panggil printConfirmation(), lalu cetak Arrival: [result] menggunakan getArrivalInfo()

Method printConfirmation() harus mencetak dalam format ini:

=== Reservation Confirmed ===
Guest: [guestName]
Room: [roomNumber]
Nights: [nights]
Requests: [getRequestsSummary()]

Output yang diharapkan:

=== Reservation Confirmed ===
Guest: Sarah Johnson
Room: 101
Nights: 3
Requests: Late checkout
Arrival: 2024-06-15 14:30:00.000
=== Reservation Confirmed ===
Guest: Mike Chen
Room: 205
Nights: 1
Requests: Extra pillows
Arrival: null
=== Reservation Confirmed ===
Guest: Emma Davis
Room: 310
Nights: 2
Requests: No special requests
Arrival: null

Coba sendiri

import 'reservation.dart';

void main() {
  // TODO: Buat reservasi untuk 'Sarah Johnson'
  // Kamar 101, 3 malam, permintaan khusus: 'Late checkout'
  // Waktu check-in: DateTime(2024, 6, 15, 14, 30)
  
  // TODO: Buat reservasi untuk 'Mike Chen'
  // Kamar 205, gunakan jumlah malam default, permintaan khusus: 'Extra pillows'
  // Waktu check-in tidak ditentukan
  
  // TODO: Buat reservasi untuk 'Emma Davis'
  // Kamar 310, 2 malam, tanpa permintaan khusus, tanpa waktu check-in
  
  // TODO: Untuk setiap reservasi sesuai urutan:
  // 1. Panggil printConfirmation()
  // 2. Cetak 'Arrival: [result]' menggunakan getArrivalInfo()
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online