CodeGym/Java Blog/Acak/Akses Pengubah di Jawa
John Squirrels
Level 41
San Francisco

Akses Pengubah di Jawa

Dipublikasikan di grup Acak
anggota
Hai! Dalam pelajaran hari ini, kita akan mengenal konsep pengubah akses dan mempertimbangkan contoh cara bekerja dengannya. Tentu saja, mengatakan 'berkenalan' kurang tepat: Anda sudah mengenal sebagian besar dari mereka dari pelajaran sebelumnya. Untuk berjaga-jaga, mari segarkan ingatan kita tentang poin terpenting. Akses pengubah paling sering adalah kata kunci yang mengatur akses ke berbagai bagian kode Anda. Mengapa 'paling sering'? Karena salah satunya disetel secara default tanpa menggunakan kata kunci :) Java memiliki empat pengubah akses. Kami mencantumkannya dalam urutan dari yang paling ketat hingga yang paling 'lunak':
  • pribadi;
  • default (paket terlihat);
  • terlindung;
  • publik.
Mari kita lihat masing-masing dan identifikasi kapan mereka mungkin berguna. Dan kami akan memberikan contoh :)

Pengubah pribadi

Pengubah akses.  Pribadi, terlindungi, default, publik - 2pribadi adalah pengubah akses yang paling ketat. Ini membatasi visibilitas data dan metode ke dalam satu kelas. Anda mengetahui pengubah ini dari pelajaran tentang getter dan setter. Ingat contoh ini?
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!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Kami mempertimbangkannya dalam pelajaran sebelumnya. Kami membuat kesalahan serius di sini: Kami menjadikan data kami publik, yang memungkinkan sesama pemrogram untuk mengakses bidang secara langsung dan mengubah nilainya. Terlebih lagi... nilai-nilai ini diberikan tanpa pemeriksaan apa pun. Artinya, program kami dapat membuat kucing bernama "" dengan usia -1000 tahun dan berat 0. Untuk mengatasi masalah ini, kami menggunakan getter dan setter, dan juga menggunakan pengubah pribadi untuk membatasi akses ke data.
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) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
Pada dasarnya, membatasi akses ke bidang dan mengimplementasikan getter dan setter adalah contoh paling umum tentang seberapa privatakan digunakan dalam pekerjaan nyata. Dengan kata lain, tujuan utama pengubah ini adalah untuk mencapai enkapsulasi dalam suatu program. Omong-omong, ini tidak hanya berlaku untuk bidang. Bayangkan bahwa dalam program Anda memiliki metode yang mengimplementasikan beberapa fungsi yang SANGAT kompleks. Apa yang bisa kami sarankan sebagai contoh? Katakanlah metode readDataFromCollider() Anda menerima alamat data sebagai input, membaca data dari Large Hadron Collider dalam format byte, mengonversi data ini menjadi teks, menulisnya ke file, dan mencetaknya. Bahkan deskripsi dari metode ini terlihat menakutkan, belum lagi kodenya :) Untuk membuat kode lebih mudah dibaca, akan lebih baik untuk tidak menulis semua logika kompleks metode di satu tempat. Sebagai gantinya, kita harus memisahkan fungsionalitas menjadi metode terpisah. Misalnya, readByteData()metode bertanggung jawab untuk membaca data, metode convertBytesToSymbols() mengubah data yang dibaca dari collider menjadi teks, metode saveToFile() menyimpan teks yang diterima ke file, dan metode printColliderData() mencetak file data kita. Pada akhirnya, metode readDataFromCollider() kita akan jauh lebih sederhana:
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
Namun, seperti yang akan Anda ingat dari pelajaran tentang antarmuka, pengguna hanya mendapatkan akses ke antarmuka eksternal. Dan 4 metode kami bukan bagian dari itu. Mereka adalah metode pembantu: kami membuatnya untuk meningkatkan keterbacaan kode dan tidak menjejalkan empat tugas berbeda ke dalam satu metode. Anda tidak perlu memberi pengguna akses ke metode ini. Jika pengguna memiliki akses ke metode convertBytesToSymbols() saat bekerja dengan collider, kemungkinan besar mereka akan bingung dengan metode tersebut dan bertanya-tanya untuk apa metode ini. Berapa byte yang dikonversi? Dari mana mereka berasal? Mengapa mengubahnya menjadi teks? Logika yang dieksekusi dalam metode ini bukan bagian dari antarmuka yang diekspos ke pengguna. Hanya readDataFromCollider()metode adalah bagian dari antarmuka. Jadi apa yang kita lakukan dengan keempat metode 'internal' ini? Benar! Gunakan pengubah pribadi untuk membatasi akses ke mereka. Melakukan hal ini memungkinkan mereka untuk melakukan pekerjaan mereka dengan damai di dalam kelas tanpa membingungkan pengguna, yang tidak perlu mengetahui logika dari masing-masing metode.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

Pengubah yang dilindungi

Pengubah paling ketat berikutnya adalah protected . Pengubah akses.  Pribadi, terlindungi, default, publik - 3Bidang dan metode yang ditandai oleh pengubah akses yang dilindungi akan terlihat:
  • dalam semua kelas yang termasuk dalam paket yang sama dengan kami;
  • dalam semua kelas yang mewarisi kelas kita.
Pada awalnya, sulit membayangkan kapan ini dibutuhkan. Jangan kaget: kasus penggunaan untuk protected jauh lebih sedikit daripada untuk private , dan sangat spesifik. Bayangkan kita memiliki kelas abstrak AbstractSecretAgent yang mewakili agen rahasia di beberapa layanan intelijen, serta paket top_secret yang berisi kelas ini dan keturunannya. Kelas konkret seperti FBISecretAgent , MI6SecretAgent , MossadSecretAgent , dll. mewarisinya. Di dalam kelas abstrak, kami ingin menerapkan penghitung agen. Ini akan meningkat ketika agen baru dibuat di suatu tempat dalam program. paket top_secret;
public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Tapi agen kami rahasia! Ini berarti bahwa mereka dan tidak ada orang lain yang tahu berapa banyak dari mereka yang ada. Kita dapat dengan mudah menambahkan pengubah yang dilindungi ke bidang agent_counter . Kemudian instance kelas agen rahasia lain dan kelas lain yang terletak di paket top_secret kami bisa mendapatkan nilainya.
public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
Dan itulah tugas khusus yang membutuhkan pengubah yang dilindungi :)

Pengubah terlihat paket

Berikutnya dalam daftar adalah pengubah default , juga dikenal sebagai pengubah terlihat paket . Itu tidak ditunjukkan oleh kata kunci, karena Java menerapkannya secara default ke semua bidang dan metode. Jika Anda menulis yang berikut dalam kode Anda:
int x = 10
variabel x akan membuat paket ini terlihat aksesnya. Sangat mudah untuk mengingat apa yang dilakukannya. Pada dasarnya, bawaan = warisan yang dilindungi :) Seperti pengubah yang dilindungi , penerapannya terbatas. Paling sering, akses default digunakan dalam paket yang memiliki beberapa kelas utilitas yang tidak mengimplementasikan fungsi dari semua kelas lain dalam paket. Mari kita beri contoh. Bayangkan kita memiliki paket 'layanan'. Ini berisi berbagai kelas yang bekerja dengan database. Misalnya, ada kelas UserService yang membaca data pengguna dari database, yaitu CarServicekelas yang membaca data mobil dari database yang sama, dan kelas lain, yang masing-masing bekerja dengan tipe objek tertentu dan membaca data yang sesuai dari database.
package services;

public class UserService {
}

package services;

public class CarService {
}
Tetapi akan mudah untuk data dalam database berada dalam satu format dan kami membutuhkannya dalam format lain. Bayangkan tanggal lahir pengguna dalam database disimpan sebagai <TIMESTAMP WITH TIME ZONE>...
2014-04-04 20:32:59.390583+02
...dan sebagai gantinya kita memerlukan objek yang paling sederhana — sebuah java.util.Date . Untuk mengatasi masalah ini, di dalam paket layanan , kita dapat membuat kelas Mapper khusus . Ini akan bertanggung jawab untuk mengubah data dari database menjadi objek Java yang kita kenal. Kelas pembantu sederhana. Kami biasanya mendeklarasikan semua kelas sebagai ClassName kelas publik , tetapi ini bukan persyaratan. Kita dapat mendeklarasikan class helper kita sebagai class Mapper . Dalam hal ini, masih melakukan tugasnya, tetapi tidak terlihat oleh siapa pun di luar paket layanan !
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Dan inilah alasan dasarnya: mengapa orang di luar paket perlu melihat kelas pembantu yang hanya bekerja dengan kelas dalam paket itu?

Pengubah publik

Dan yang tak kalah pentingnya, pengubah publik ! Anda bertemu pengubah ini pada hari pertama belajar di CodeGym saat pertama kali Anda menjalankan public static void main(String[] args) . Pengubah akses.  Pribadi, terlindungi, default, publik - 4Sekarang setelah Anda mempelajari pelajaran tentang antarmuka, tujuannya jelas bagi Anda :) Lagi pula, pengubah publik dibuat untuk memberikan sesuatu kepada pengguna. Misalnya, antarmuka program Anda. Misalkan Anda telah menulis sebuah program penerjemah yang dapat menerjemahkan teks bahasa Rusia ke dalam bahasa Inggris. Anda membuat metode translate(String textInRussian) yang mengimplementasikan semua logika yang diperlukan. Anda menandai metode ini dengan kata public , dan sekarang menjadi bagian dari antarmuka:
public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
Anda dapat mengikat metode ini ke tombol 'Terjemahkan' di layar dan selesai! Siapapun bisa menggunakannya. Bagian kode yang ditandai dengan pengubah publik ditujukan untuk pengguna akhir. Memberikan contoh nyata, privat untuk semua proses yang terjadi di dalam TV, tetapi publik untuk tombol pada remote control yang digunakan untuk mengelola TV. Terlebih lagi, pengguna tidak perlu tahu bagaimana televisi dibuat atau cara kerjanya. Remote control adalah kumpulan metode publik : on() , off() , nextChannel() , previousChannel() , increaseVolume() , reductionVolume() dll. 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