final dan kata kunci Java lainnya - 1

"Hai, Amigo!"

"Hai, Bilaabo!"

"Hari ini saya akan memberi tahu Anda tentang beberapa kata kunci di Jawa. Tapi saya akan mulai dengan yang paling menarik: kata kunci final. "

"Anda dapat menggunakan kata kunci final saat mendeklarasikan variabel, metode, atau kelas."

"Dan mengapa kita membutuhkan final?"

"Cukup sederhana. Jika kita menandai sebuah variabel sebagai final, maka itu menjadi tidak dapat diubah:"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"Jadi begitu."

"Jika kita menandai sebuah metode sebagai final, maka mengesampingkan metode di kelas turunan dilarang:"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"Begitu. Tapi mengapa Anda perlu melarang metode yang diganti?"

"Nah, sebagai contoh, misalkan seorang programmer telah menulis banyak kode penting dalam sebuah metode dan ingin menjamin bahwa semua kelas yang mewarisi kelasnya akan memiliki perilaku yang ditentukan."

"Dan akhirnya, penggunaan ketiga."

"Jika kita menandai sebuah kelas dengan kata kunci final, maka itu tidak dapat diwariskan."

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

"Dan mengapa kita mencegah kelas untuk diwariskan?"

"Anda harus memahami bahwa kami tidak mencegah pewarisan untuk mengganggu, melainkan demi keamanan dan integritas kode. Jika pewarisan kelas tidak dilarang, maka implikasinya diperbolehkan. Dan bahwa kode ditulis oleh pemilik kelas desainer akan bekerja dengan baik untuk objek dari kelas ini serta objek dari kelas turunan apa pun."

"Tetapi jika seorang pengembang menyadari bahwa bahkan perubahan kecil pada kelasnya akan menyebabkan semuanya berhenti bekerja seperti yang diharapkan, maka lebih baik untuk melarang pewarisan."

"Misalnya, kelas String dideklarasikan sebagai final, seperti juga semua tipe primitif: Integer, Boolean, Double, Character…"

"Ah, mengerti. Kelas String dibuat sebagai kelas yang tidak dapat diubah dan jika tiba-tiba berubah, maka banyak hal akan berhenti berfungsi."

"Yah, hampir. Mari kita begini: semuanya akan bekerja hampir seperti sebelumnya, tetapi kadang-kadang akan ada kesalahan yang akan sangat sulit ditemukan dan dipahami. Jadi, dalam beberapa kasus, mewarisi kelas atau metode bukanlah dosa, tetapi melarangnya berarti lebih sedikit kesalahan yang harus ditangkap nanti."

"Di mana lagi kamu bisa menggunakan final?"

"Anda dapat menggunakan final sebelum parameter fungsi, dan sebelum variabel dalam suatu metode. Berikut contohnya:"

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

"Dan apa gunanya itu?"

"Yah, ada dua. Pertama, kita mendeklarasikan variabel sebagai final jika kita ingin memberi tahu developer lain bahwa nilai ini adalah konstanta tertentu, dan bukan hanya variabel."

Misalnya, kami ingin menghitung pajak penjualan berdasarkan harga:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"Dan kedua, kita membutuhkan jenis variabel ini saat menulis kelas dalam lokal atau anonim. Saya akan segera memberi tahu Anda tentang jenis kelas ini. Tapi tidak hari ini."

"Oke, sejauh ini belum ada yang terlalu rumit."

"Harap perhatikan bahwa hanya variabel yang tidak dapat diubah, bukan objek yang dirujuknya. Objek masih dapat diubah."

"Aku sebenarnya baru saja akan bertanya tentang itu. Dan tidak ada cara untuk membuat objek itu tidak bisa diubah?"

"Tidak, kecuali jika Anda menulis kelas yang tidak dapat diubah."

"Harap diperhatikan bahwa karena nilai variabel akhir tidak dapat diubah, Anda harus segera menetapkan nilai awalnya."

Kode ini akan dikompilasi Kode ini tidak dapat dikompilasi
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"Tapi, yang mengatakan, Java memungkinkan Anda menunda inisialisasi variabel akhir kelas hingga konstruktor."

Kode ini akan dikompilasi Kode ini tidak dapat dikompilasi
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"Selain itu, konstruktor yang berbeda dapat menginisialisasi variabel akhir dengan nilai yang berbeda. Ini cukup nyaman:"

Kode ini akan dikompilasi
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"Itu topik yang sangat menarik, dan semuanya masuk akal. Terima kasih, Bilaabo!"