Hai! Mari dedikasikan pelajaran hari ini untuk enkapsulasi dan langsung mulai dengan contoh :) Prinsip enkapsulasi - 1Di sini Anda memiliki mesin soda biasa . Saya punya satu pertanyaan untuk Anda: bagaimana cara kerjanya? Coba berikan jawaban yang mendetail: dari mana cangkir itu berasal, bagaimana suhu internal dipertahankan, di mana es disimpan, bagaimana mesin mengetahui sirup mana yang harus ditambahkan, dll.? Anda mungkin tidak memiliki jawaban untuk pertanyaan-pertanyaan ini. Cukup adil, karena tidak semua orang menggunakan mesin seperti itu. Mereka tidak begitu populer saat ini. Mari kita coba berikan contoh lain. Sesuatu yang pasti Anda gunakan berkali-kali setiap hari. Oh, ini ide! Prinsip enkapsulasi - 2Beritahu kami bagaimana mesin pencari Googlebekerja. Bagaimana tepatnya cara mencari informasi yang terkait dengan kata yang Anda masukkan? Mengapa hasil tertentu berperingkat tinggi dan bukan yang lain? Meskipun Anda menggunakan Google setiap hari, kemungkinan besar Anda tidak tahu. Tapi itu tidak masalah. Anda tidak perlu tahu ini. Anda dapat memasukkan kueri ke dalam mesin telusur tanpa memikirkan cara kerjanya. Anda dapat membeli soda dari mesin tanpa mengetahui cara kerjanya. Anda dapat mengendarai mobil tanpa memahami cara kerja mesin pembakaran dalam, dan tanpa mengetahui fisika sama sekali, bahkan di tingkat sekolah dasar. Semua ini dimungkinkan berkat salah satu prinsip utama pemrograman berorientasi objek: enkapsulasi. Membaca berbagai artikel tentang pemrograman berorientasi objek (OOP), Anda pasti menemukan fakta bahwa pemrograman melibatkan dua konsep umum: enkapsulasi dan penyembunyian . Dan penulis menggunakan kata "enkapsulasi" untuk mengartikan satu dan lain hal. Kami akan mengeksplorasi kedua istilah sehingga Anda mendapatkan pemahaman yang lengkap. Dalam pemrograman, arti sebenarnya dari enkapsulasi adalah menggabungkan data, bersama dengan metode yang beroperasi pada data tersebut, menjadi satu kesatuan (yaitu "kapsul"). Di Jawa, kelas adalah unit enkapsulasi. Kelas berisi data (bidang) dan metode untuk bekerja dengan data ini.Prinsip enkapsulasi - 3Ini mungkin tampak seperti pendekatan yang benar bagi Anda, tetapi dalam paradigma pemrograman lain, semuanya diatur secara berbeda. Misalnya, dalam pemrograman fungsional, data dipisahkan secara ketat dari operasi di dalamnya. Dalam OOP, program terdiri dari kapsul, atau kelas, yang terdiri dari data dan fungsi untuk bekerja dengan data tersebut. Sekarang mari kita bicara tentang bersembunyi . Bagaimana mungkin kita menggunakan semua jenis perangkat yang rumit tanpa memahami cara mengaturnya atau cara kerjanya? Sederhana: pembuatnya memberi kami antarmuka yang sederhana dan nyaman. Pada mesin soda, antarmukanya adalah tombol-tombol pada panel. Menekan satu tombol, Anda memilih ukuran cangkir. Menekan yang lain, Anda memilih rasanya. Sepertiga bertanggung jawab untuk menambahkan es. Dan hanya itu yang perlu Anda lakukan. Organisasi internal mesin tidak masalah. Yang penting itu dirancang sedemikian rupa sehingga mengharuskan pengguna menekan tiga tombol untuk mendapatkan soda . Hal yang sama berlaku untuk mobil. Tidak peduli apa yang terjadi di dalam. Yang penting adalah saat Anda menekan pedal kanan, mobil bergerak maju, dan saat Anda menekan pedal kiri, kecepatannya melambat. Itulah arti bersembunyi. Semua "bagian dalam" program disembunyikan dari pengguna. Bagi pengguna, informasi yang berlebihan dan tidak perlu ini. Pengguna membutuhkan hasil akhir, bukan proses internal. Mari kita lihat Autokelas sebagai contoh:

public class Auto {

   public void go() {

       /* Some complicated things happen inside the car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside the car.
       As a result, it slows down. */
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // From the user's perspective,

       // one pedal is pressed and the car accelerates.
       auto.gas();
      
       // The other is pressed, and the car slows down.
       auto.brake();
   }
}
Inilah yang terlihat seperti penyembunyian implementasi dalam program Java. Ini seperti dalam kehidupan nyata: pengguna diberikan antarmuka (metode). Jika pengguna membutuhkan mobil dalam suatu program untuk melakukan suatu tindakan, dia hanya memanggil metode yang diinginkan. Apa yang terjadi di dalam metode ini berlebihan. Yang penting semuanya berjalan sebagaimana mestinya. Di sini kita berbicara tentang penerapan penyembunyian . Selain itu, Java juga memiliki penyembunyian data . Kami menulis tentang itu dalam pelajaran tentang getter dan setter , tetapi meninjau konsepnya tidak akan merugikan. Misalnya, kami memiliki Catkelas:

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!");
   }

  
}
Mungkin Anda ingat masalah kelas ini dari pelajaran terakhir? Jika belum, mari kita ingat sekarang. Masalahnya adalah datanya (bidang) terbuka untuk semua orang — programmer lain dapat dengan mudah membuat kucing tanpa nama dengan bobot 0 dan usia -1000 tahun:

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Mungkin Anda dapat mengawasi apakah salah satu rekan kerja Anda telah membuat objek dengan status tidak valid, tetapi akan jauh lebih baik untuk mengecualikan bahkan kemungkinan membuat "objek tidak valid" semacam itu. Prinsip enkapsulasi - 4Mekanisme berikut membantu kami mencapai penyembunyian data:
  1. pengubah akses ( private , protected , package default )
  2. getter dan setter
Misalnya, kita dapat memberi tanda centang di sana untuk melihat apakah seseorang mencoba memberi angka negatif pada usia kucing. Seperti yang kami katakan sebelumnya, penulis berbagai artikel tentang enkapsulasi terkadang berarti menggabungkan data dan metode, atau menyembunyikannya, atau keduanya (menggabungkan dan menyembunyikannya). Java memiliki kedua mekanisme (ini belum tentu berlaku untuk bahasa OOP lainnya), jadi arti terakhir adalah yang paling benar. Enkapsulasi memberi kita beberapa keuntungan penting:
  1. Kontrol atas keadaan objek yang benar. Ada contohnya di atas. Penyetel dan pengubah pribadi memastikan bahwa program kami tidak akan memiliki kucing yang beratnya 0.

  2. Keramahan pengguna melalui antarmuka. Hanya metode yang dibiarkan "terbuka" ke dunia luar. Memanggil metode sudah cukup untuk mendapatkan hasil — sama sekali tidak perlu mempelajari detail cara kerjanya.

  3. Perubahan kode tidak memengaruhi pengguna. Kami membuat setiap dan semua perubahan di dalam metode. Ini tidak memengaruhi pengguna metode: jika kode yang benar sebelumnya adalah "auto.gas()" untuk menerapkan pedal gas, maka akan terus seperti itu. Fakta bahwa kita telah mengubah sesuatu di dalam metode gas() tetap tidak terlihat oleh pengguna: seperti sebelumnya, pemanggil hanya menerima hasil yang diinginkan.