CodeGym/Blog Java/rawak/Akses Pengubahsuai dalam Java
John Squirrels
Tahap
San Francisco

Akses Pengubahsuai dalam Java

Diterbitkan dalam kumpulan
Hai! Dalam pelajaran hari ini, kita akan membiasakan diri dengan konsep pengubah suai akses dan mempertimbangkan contoh cara bekerja dengannya. Sudah tentu, mengatakan 'berkenalan' adalah tidak betul: anda sudah biasa dengan kebanyakan daripada mereka dari pelajaran sebelumnya. Untuk berjaga-jaga, mari segarkan ingatan kita tentang perkara yang paling penting. Akses pengubah suai selalunya adalah kata kunci yang mengawal selia akses kepada bahagian berlainan kod anda. Mengapa 'paling kerap'? Kerana salah satu daripadanya ditetapkan secara lalai tanpa menggunakan kata kunci :) Java mempunyai empat pengubah akses. Kami menyenaraikannya mengikut urutan daripada yang paling terhad kepada yang paling 'lembut':
  • persendirian;
  • lalai (pakej kelihatan);
  • dilindungi;
  • awam.
Mari kita lihat setiap daripada mereka dan kenal pasti bila ia mungkin berguna. Dan kami akan berikan contoh :)

Pengubah suai peribadi

Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 2peribadi ialah pengubah suai akses yang paling ketat. Ia mengehadkan keterlihatan data dan kaedah kepada dalam satu kelas. Anda tahu pengubah suai ini daripada 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 kesilapan yang serius di sini: Kami menjadikan data kami terbuka, yang membenarkan rakan pengaturcara mengakses medan secara langsung dan menukar nilainya. Apatah lagi... nilai ini diberikan tanpa sebarang semakan. Ini bermakna program kami boleh mencipta kucing bernama "" dengan umur -1000 tahun dan berat 0. Untuk menyelesaikan masalah ini, kami menggunakan getter dan setter, dan juga menggunakan pengubah suai peribadi untuk mengehadkan akses kepada 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 asasnya, mengehadkan akses kepada medan dan melaksanakan getter dan setter ialah contoh paling biasa tentang cara peribadiakan digunakan dalam kerja sebenar. Dengan kata lain, tujuan utama pengubahsuai ini adalah untuk mencapai enkapsulasi dalam sesuatu atur cara. Ini tidak terpakai hanya untuk medan, dengan cara. Bayangkan bahawa dalam program anda mempunyai kaedah yang melaksanakan beberapa fungsi yang SANGAT kompleks. Apa yang boleh kita cadangkan sebagai contoh? Katakan kaedah readDataFromCollider() anda menerima sebagai input alamat data, membaca data daripada Large Hadron Collider dalam format bait, menukar data ini kepada teks, menulisnya ke fail dan mencetaknya. Walaupun penerangan kaedah kelihatan menakutkan, untuk mengatakan apa-apa kod :) Untuk menjadikan kod lebih mudah dibaca, adalah lebih baik untuk tidak menulis semua logik kompleks kaedah di satu tempat. Sebaliknya, kita harus memecahkan fungsi kepada kaedah yang berasingan. Sebagai contoh, readByteData()kaedah bertanggungjawab untuk membaca data, kaedah convertBytesToSymbols() menukarkan data yang dibaca daripada collider kepada teks, kaedah saveToFile() menyimpan teks yang diterima ke fail dan kaedah printColliderData() mencetak fail data kami. Pada akhirnya, kaedah readDataFromCollider() kami akan menjadi lebih mudah:
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
   }
}
Walau bagaimanapun, seperti yang anda akan ingat daripada pelajaran tentang antara muka, pengguna hanya mendapat akses kepada antara muka luaran. Dan 4 kaedah kami bukan sebahagian daripadanya. Ia adalah kaedah pembantu: kami menciptanya untuk meningkatkan kebolehbacaan kod dan untuk tidak menjejalkan empat tugas yang berbeza ke dalam satu kaedah. Anda tidak perlu memberi pengguna akses kepada kaedah ini. Jika pengguna mempunyai akses kepada kaedah convertBytesToSymbols() apabila bekerja dengan collider, mereka berkemungkinan besar akan keliru dengan kaedah tersebut dan tertanya-tanya untuk apa ia. Apakah bait yang ditukar? Dari mana mereka datang? Mengapa menukarnya kepada teks? Logik yang dilaksanakan dalam kaedah ini bukan sebahagian daripada antara muka yang didedahkan kepada pengguna. Hanya readDataFromCollider()kaedah adalah sebahagian daripada antara muka. Jadi apa yang kita lakukan dengan empat kaedah 'dalaman' ini? Betul! Gunakan pengubah suai peribadi untuk mengehadkan akses kepada mereka. Melakukan ini membolehkan mereka melakukan kerja mereka dengan aman di dalam kelas tanpa mengelirukan pengguna, yang tidak perlu mengetahui logik setiap kaedah individu.
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 suai yang dilindungi

Pengubah suai paling ketat seterusnya dilindungi . Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 3Medan dan kaedah yang ditandakan oleh pengubah suai akses yang dilindungi akan kelihatan:
  • dalam semua kelas termasuk dalam pakej yang sama seperti kami;
  • dalam semua kelas yang mewarisi kelas kami.
Pada mulanya, sukar untuk membayangkan bila ini mungkin diperlukan. Jangan terkejut: terdapat lebih sedikit kes penggunaan untuk protected berbanding private , dan ia sangat khusus. Bayangkan bahawa kami mempunyai kelas abstrak AbstractSecretAgent yang mewakili ejen rahsia dalam sesetengah perkhidmatan risikan, serta pakej top_secret yang mengandungi kelas ini dan keturunannya. Kelas konkrit seperti FBISecretAgent , MI6SecretAgent , MossadSecretAgent , dll. mewarisinya. Di dalam kelas abstrak, kami ingin melaksanakan kaunter ejen. Ia akan meningkat apabila ejen baharu dicipta di suatu tempat dalam program. pakej top_secret;
public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Tetapi ejen kami adalah rahsia! Ini bermakna bahawa mereka dan tiada orang lain harus tahu berapa banyak daripada mereka wujud. Kita boleh dengan mudah menambah pengubah suai yang dilindungi ke medan agent_counter . Kemudian contoh kelas ejen rahsia lain dan kelas lain yang terletak dalam pakej top_secret kami boleh mendapatkan nilainya.
public abstract class AbstractSecretAgent {

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

Pengubah suai pakej yang boleh dilihat

Seterusnya dalam senarai ialah pengubah suai lalai , juga dikenali sebagai pengubah boleh dilihat pakej . Ia tidak ditunjukkan oleh kata kunci, kerana Java menggunakannya secara lalai untuk semua medan dan kaedah. Jika anda menulis perkara berikut dalam kod anda:
int x = 10
pembolehubah x akan mempunyai akses yang boleh dilihat pakej ini . Sangat mudah untuk mengingati apa yang dilakukannya. Pada asasnya, lalai = warisan yang dilindungi :) Seperti pengubah yang dilindungi , aplikasinya adalah terhad. Selalunya, akses lalai digunakan dalam pakej yang mempunyai beberapa kelas utiliti yang tidak melaksanakan fungsi semua kelas lain dalam pakej. Mari kita beri contoh. Bayangkan kita ada pakej 'perkhidmatan'. Ia mengandungi pelbagai kelas yang berfungsi dengan pangkalan data. Contohnya, terdapat kelas UserService yang membaca data pengguna daripada pangkalan data, CarServicekelas yang membaca data kereta daripada pangkalan data yang sama, dan kelas lain, setiap satunya berfungsi dengan jenis objek tertentu dan membaca data yang sepadan daripada pangkalan data.
package services;

public class UserService {
}

package services;

public class CarService {
}
Tetapi adalah mudah untuk data dalam pangkalan data berada dalam satu format dan kami memerlukannya dalam format lain. Bayangkan bahawa tarikh lahir pengguna dalam pangkalan data disimpan sebagai <TIMESTAMP WITH TIME ZONE>...
2014-04-04 20:32:59.390583+02
...dan sebaliknya kita memerlukan objek yang paling mudah — java.util.Date . Untuk menyelesaikan masalah ini, di dalam pakej perkhidmatan , kita boleh membuat kelas Mapper khas . Ia akan bertanggungjawab untuk menukar data daripada pangkalan data kepada objek Java biasa kami. Kelas pembantu yang mudah. Kami biasanya mengisytiharkan semua kelas sebagai kelas awam ClassName , tetapi ini bukan satu keperluan. Kami boleh mengisytiharkan kelas pembantu kami hanya sebagai kelas Mapper . Dalam kes ini, ia masih menjalankan tugasnya, tetapi ia tidak kelihatan kepada sesiapa di luar pakej perkhidmatan !
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Dan inilah alasan asas: mengapa sesiapa di luar pakej perlu melihat kelas pembantu yang hanya berfungsi dengan kelas dalam pakej itu?

Pengubah suai awam

Dan akhir sekali, pengubahsuai awam ! Anda bertemu pengubah suai ini pada hari pertama pengajian anda di CodeGym pada kali pertama anda menjalankan public static void main(String[] args) . Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 4Memandangkan anda telah mempelajari pelajaran tentang antara muka, tujuannya jelas kepada anda :) Lagipun, pengubah suai awam dicipta untuk memberikan sesuatu kepada pengguna. Contohnya, antara muka program anda. Katakan anda telah menulis program penterjemah yang boleh menterjemah teks Rusia ke dalam bahasa Inggeris. Anda mencipta kaedah terjemah (String textInRussian) yang melaksanakan semua logik yang diperlukan. Anda menandakan kaedah ini dengan perkataan public , dan kini ia adalah sebahagian daripada antara muka:
public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
Anda boleh mengikat kaedah ini pada butang 'Terjemah' pada skrin dan anda sudah selesai! Sesiapa sahaja boleh menggunakannya. Bahagian kod yang ditandakan dengan pengubah suai awam bertujuan untuk pengguna akhir. Menyediakan contoh kehidupan sebenar, peribadi adalah untuk semua proses yang berlaku di dalam TV, tetapi awam adalah untuk butang pada alat kawalan jauh yang digunakan untuk mengurus TV. Apatah lagi, pengguna tidak perlu tahu bagaimana televisyen itu dibina atau cara ia berfungsi. Alat kawalan jauh ialah set kaedah awam : on() , off() , nextChannel() , previousChannel() , increaseVolume() , reduceVolume() dsb. Untuk mengukuhkan apa yang anda pelajari, kami cadangkan anda menonton pelajaran video daripada Kursus Java kami
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi