CodeGym/Java Blog/Acak/Getter dan setter
John Squirrels
Level 41
San Francisco

Getter dan setter

Dipublikasikan di grup Acak
anggota
Halo! Dalam pelajaran sebelumnya, Anda telah mempelajari cara mendeklarasikan kelas lengkap Anda sendiri dengan metode dan bidang. Dalam pelajaran hari ini, kita akan berbicara tentang Getter dan Setter di Java. Ini adalah kemajuan yang serius, bagus sekali! Tetapi sekarang saya harus memberi tahu Anda kebenaran yang tidak menyenangkan. Kami tidak mendeklarasikan kelas kami dengan benar! Mengapa? Pada pandangan pertama, kelas berikut tidak memiliki kesalahan apapun:
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}
Tapi itu benar. Bayangkan Anda sedang duduk di tempat kerja dan menulis kelas Kucing ini untuk mewakili kucing. Dan kemudian Anda pulang. Saat Anda pergi, programmer lain tiba di tempat kerja. Dia membuat kelas Utamanya sendiri , di mana dia mulai menggunakan kelas Kucing yang Anda tulis.
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Tidak masalah mengapa dia melakukannya dan bagaimana itu terjadi (mungkin pria itu lelah atau kurang tidur). Hal lain yang penting: kelas Cat kita saat ini memungkinkan bidang diberi nilai yang benar-benar gila. Akibatnya, program memiliki objek dengan status tidak valid (seperti kucing ini yang berumur -1000 tahun). Jadi kesalahan apa yang kita buat saat mendeklarasikan kelas kita? Kami membuka data kelas kami. Bidang nama, usia, dan berat bersifat publik. Mereka dapat diakses di mana saja dalam program: cukup buat objek Cat dan pemrogram mana pun memiliki akses langsung ke datanya melalui operator titik ( . )
Cat cat = new Cat();
cat.name = "";
Di sini kita langsung mengakses bidang nama dan menetapkan nilainya. Kami perlu melindungi data kami dari interferensi eksternal yang tidak semestinya. Apa yang perlu kita lakukan itu? Pertama, semua variabel instan (bidang) harus ditandai dengan pengubah pribadi. Pribadi adalah pengubah akses paling ketat di Jawa. Setelah Anda melakukannya, bidang kelas Cat tidak akan dapat diakses di luar kelas.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";//error! The Cat class's name field is private!
   }
}
Kompiler melihat ini dan segera menghasilkan kesalahan. Sekarang bidang semacam terlindungi. Namun ternyata kami telah menutup akses mungkin terlalu ketat: Anda tidak bisa mendapatkan bobot kucing yang ada dalam program ini, bahkan jika perlu. Ini juga bukan pilihan. Seperti itu, kelas kami pada dasarnya tidak dapat digunakan. Idealnya, kita perlu mengizinkan semacam akses terbatas:
  • Pemrogram lain harus bisa membuat objek Cat
  • Mereka harus bisa membaca data dari objek yang ada (misalnya, mendapatkan nama atau umur kucing yang ada)
  • Ini juga harus memungkinkan untuk menetapkan nilai bidang. Namun dalam melakukannya, hanya nilai valid yang boleh diizinkan. Objek kita harus dilindungi dari nilai yang tidak valid (misalnya usia = -1000, dll.).
Itu daftar persyaratan yang layak! Pada kenyataannya, semua ini mudah dicapai dengan metode khusus yang disebut getter dan setter.
Getter dan setter - 2
Nama-nama ini berasal dari "dapatkan" (yaitu "metode untuk mendapatkan nilai bidang") dan "set" (yaitu "metode untuk menetapkan nilai bidang"). Mari kita lihat tampilannya di kelas Cat kita :
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       this.weight = weight;
   }
}
Seperti yang Anda lihat, tampilannya cukup sederhana :) Namanya sering terdiri dari "get"/"set" ditambah nama bidang yang relevan. Misalnya, metode getWeight() mengembalikan nilai bidang bobot untuk objek yang dipanggil. Begini tampilannya dalam sebuah program:
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       String smudgeName = smudge.getName();
       int smudgeAge = smudge.getAge();
       int smudgeWeight = smudge.getWeight();

       System.out.println("Cat's name: " + smudgeName);
       System.out.println("Cat's age: " + smudgeAge);
       System.out.println("Cat's weight: " + smudgeWeight);
   }
}
Keluaran konsol:
Cat's name: Smudge
Cat's age: 5
Cat's weight: 4
Sekarang kelas lain ( Main ) dapat mengakses bidang Cat , tetapi hanya melalui getter. Perhatikan bahwa getter memiliki pengubah akses publik, yaitu tersedia dari mana saja dalam program. Tapi bagaimana dengan menetapkan nilai? Inilah gunanya metode setter
public void setName(String name) {
   this.name = name;
}
Seperti yang Anda lihat, mereka juga sederhana. Kami memanggil metode setName() pada objek Cat , meneruskan string sebagai argumen, dan string ditetapkan ke bidang nama objek.
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);

       System.out.println("Cat's original name: " + smudge.getName());
       smudge.setName("Mr. Smudge");
       System.out.println("Cat's new name: " + smudge.getName());
   }
}
Di sini kita menggunakan getter dan setter. Pertama, kami menggunakan pengambil untuk mendapatkan dan menampilkan nama asli kucing. Kemudian, kami menggunakan setter untuk menetapkan nama baru ("Mr. Smudge"). Dan kemudian kami menggunakan pengambil sekali lagi untuk mendapatkan nama (untuk memeriksa apakah itu benar-benar berubah). Keluaran konsol:
Cat's original name: Smudge
Cat's new name: Mr. Smudge
Jadi apa bedanya? Kami masih dapat menetapkan nilai yang tidak valid ke bidang meskipun kami memiliki penyetel:
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
Keluaran konsol:
Smudge's age: -1000 years
Perbedaannya adalah bahwa setter adalah metode lengkap. Dan tidak seperti bidang, metode memungkinkan Anda menulis logika verifikasi yang diperlukan untuk mencegah nilai yang tidak dapat diterima. Misalnya, Anda dapat dengan mudah mencegah angka negatif ditetapkan sebagai usia:
public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age can't be negative!");
   }
}
Dan sekarang kode kami berfungsi dengan benar!
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
Keluaran konsol:
Error! Age can't be negative!
Smudge's age: 5 years
Di dalam setter, kami membuat batasan yang melindungi kami dari upaya menyetel data yang tidak valid. Usia Smudge tidak berubah. Anda harus selalu membuat getter dan setter. Bahkan jika tidak ada batasan pada nilai apa yang dapat diambil bidang Anda, metode pembantu ini tidak akan merugikan. Bayangkan situasi berikut: Anda dan kolega Anda sedang menulis program bersama. Anda membuat kelas Cat dengan bidang publik. Semua programmer menggunakannya sesuka mereka. Dan kemudian suatu hari Anda menyadari: "Sial, cepat atau lambat seseorang mungkin secara tidak sengaja memberikan angka negatif pada bobot! Kita perlu membuat setter dan menjadikan semua bidang pribadi!" Anda melakukan hal itu, dan langsung memecahkan semua kode yang ditulis oleh kolega Anda. Lagipula, merekaBidang kucing secara langsung.
cat.name = "Behemoth";
Dan sekarang bidangnya bersifat pribadi dan kompiler memuntahkan banyak kesalahan!
cat.name = "Behemoth";//error! The Cat class's name field is private!
Dalam hal ini, akan lebih baik menyembunyikan bidang dan membuat pengambil dan penyetel dari awal. Semua kolega Anda akan menggunakannya. Dan jika Anda terlambat menyadari bahwa Anda perlu membatasi nilai bidang, Anda bisa saja menulis cek di dalam setter. Dan kode siapa pun tidak akan rusak. Tentu saja, jika Anda ingin akses ke bidang menjadi "hanya baca", Anda hanya dapat membuat pengambil untuk bidang tersebut. Hanya metode yang harus tersedia secara eksternal (yaitu di luar kelas Anda). Data harus disembunyikan. Kita bisa membuat perbandingan dengan ponsel. Bayangkan bahwa alih-alih telepon seluler tertutup biasa, Anda diberi telepon dengan kasing terbuka, dengan segala macam kabel yang menonjol, sirkuit, dll. Tetapi telepon berfungsi: jika Anda berusaha sangat keras dan menyodok sirkuit, Anda bahkan mungkin bisa melakukan panggilan. Tapi kamu'
Getter dan setter - 3
Sebaliknya, pabrikan memberi Anda antarmuka: pengguna cukup memasukkan angka yang benar, menekan tombol panggil hijau, dan panggilan dimulai. Dia tidak peduli apa yang terjadi di dalam dengan sirkuit dan kabel, atau bagaimana mereka menyelesaikan pekerjaannya. Dalam contoh ini, perusahaan membatasi akses ke "bagian dalam" telepon (data) dan hanya memperlihatkan antarmuka (metode). Hasilnya, pengguna mendapatkan apa yang diinginkannya (kemampuan untuk melakukan panggilan) dan tentunya tidak akan merusak apa pun di dalamnya. Untuk memperkuat apa yang Anda pelajari, kami sarankan Anda menonton video pelajaran dari Kursus Java kami
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar