JavaRush /Blog Java /Random-MS /Pengubah suai akses. Peribadi, dilindungi, lalai, awam

Pengubah suai akses. Peribadi, dilindungi, lalai, awam

Diterbitkan dalam kumpulan
hello! Dalam kuliah hari ini kita akan berkenalan dengan konsep " pengubah akses " dan melihat contoh bekerja dengan mereka. Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 1Walaupun perkataan "mari kita berkenalan" tidak sepenuhnya betul: anda sudah biasa dengan kebanyakannya dari kuliah sebelumnya. Untuk berjaga-jaga, mari segarkan ingatan kita tentang perkara utama. Pengubah suai akses selalunya ialah kata kunci yang mengawal tahap akses kepada bahagian lain kod anda. Mengapa "paling kerap"? Kerana salah satu daripadanya ditetapkan secara lalai dan tidak ditunjukkan oleh kata kunci :) Terdapat sejumlah empat pengubah akses dalam Java. Kami menyenaraikannya mengikut urutan dari yang paling ketat kepada yang paling "lembut":
  • persendirian;
  • dilindungi;
  • lalai (pakej kelihatan);
  • awam
Mari kita lihat setiap daripada mereka, tentukan bila ia boleh berguna kepada kita dan berikan contoh :)

Pengubah suai peribadi

Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 2Private— pengubah suai akses yang paling ketat. Ia mengehadkan keterlihatan data dan kaedah dalam satu kelas. Anda tahu pengubah suai ini daripada kuliah 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 melihatnya dalam salah satu artikel sebelum ini. Di sini kami membuat kesilapan yang serius: kami membuka data kami, akibatnya rakan pengaturcara mempunyai akses terus ke medan kelas dan menukar nilai mereka. Lebih-lebih lagi, nilai-nilai ini diberikan tanpa semakan, akibatnya dalam program kami adalah mungkin untuk mencipta kucing dengan umur -1000 tahun, nama "" dan berat 0. Untuk menyelesaikan masalah ini, kami menggunakan getter dan setter , dan juga akses terhad kepada data menggunakan pengubah suai private.
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) {
       // checking the input parameter
       this.name = name;
   }

   public int getAge() {
       return age;
   }

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

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // checking the input parameter
       this.weight = weight;
   }
}
Sebenarnya, mengehadkan akses kepada medan dan melaksanakan getter-setter ialah contoh penggunaan yang paling biasa privatedalam kerja sebenar. Iaitu, melaksanakan enkapsulasi dalam program adalah tujuan utama pengubahsuai ini. Ini terpakai bukan sahaja untuk bidang, dengan cara itu. Bayangkan bahawa dalam program anda terdapat kaedah yang melaksanakan beberapa fungsi yang SANGAT kompleks. Untuk menghasilkan ini sebagai contoh... Katakan kaedah anda readDataFromCollider()mengambil alamat dengan data sebagai input, membaca data daripada Large Hadron Collider dalam format bait, menukar data ini kepada teks, menulisnya ke fail dan mencetaknya. Malah penerangan kaedah itu kelihatan menyeramkan, apatah lagi kodnya :) Untuk meningkatkan kebolehbacaan kod, adalah baik untuk tidak menulis logik kompleks kaedah di satu tempat, tetapi, sebaliknya, untuk memecahkan fungsi ke dalam kaedah yang berasingan. Sebagai contoh, kaedah ini readByteData()bertanggungjawab untuk membaca data, convertBytesToSymbols()menukar data yang dibaca daripada collider kepada teks, saveToFile()menyimpan teks yang terhasil ke fail dan printColliderData()mencetak fail data kami. Kaedahnya readDataFromCollider()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) {

       // convert bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // save the read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // print data from file
   }
}
Walau bagaimanapun, seperti yang anda ingat daripada kuliah mengenai antara muka, pengguna hanya mendapat akses kepada antara muka akhir. Dan 4 kaedah kami bukan sebahagian daripadanya. Ia adalah tambahan : kami menciptanya untuk meningkatkan kebolehbacaan kod dan untuk mengelakkan menjejalkan empat tugas yang berbeza ke dalam satu kaedah. Tidak perlu memberi pengguna akses kepada kaedah ini. Jika pengguna mempunyai akses kepada kaedah semasa bekerja dengan collider convertBytesToSymbols(), dia kemungkinan besar tidak akan memahami kaedah ini dan mengapa ia diperlukan. Apakah bait yang ditukar? Dari mana mereka datang? Mengapa menukarnya kepada teks? Logik yang berjalan dalam kaedah ini bukan sebahagian daripada antara muka pengguna. Hanya kaedah readDataFromCollider()adalah sebahagian daripada antara muka. Apa yang perlu dilakukan dengan empat kaedah "dalaman" ini? Betul! Hadkan akses kepada mereka dengan pengubah suai private. Dengan cara ini mereka boleh dengan mudah melakukan kerja mereka di dalam kelas dan tidak mengelirukan pengguna, yang tidak memerlukan logik setiap daripada mereka secara berasingan.
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) {
       // convert bytes to characters
   }

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

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

Pengubah suai dilindungi

Pengubah suai akses paling terhad seterusnya ialah protected. Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 3 Medan dan kaedah yang ditetapkan dengan pengubah suai akses protectedakan kelihatan:
  • dalam semua kelas yang berada dalam pakej yang sama seperti kami;
  • dalam semua kelas pengganti kelas kami.
Ia serta-merta sukar untuk membayangkan apabila ini mungkin diperlukan. Jangan terkejut: protectedterdapat lebih sedikit kes permohonan daripada private, dan ia adalah khusus. Bayangkan kita mempunyai kelas abstrak AbstractSecretAgentyang menandakan ejen rahsia beberapa agensi perisikan, serta pakej top_secretyang mengandungi kelas ini dan keturunannya. Kelas konkrit - FBISecretAgent, MI6SecretAgent, MossadSecretAgentdsb. - diwarisi daripadanya. Di dalam kelas abstrak kami ingin melaksanakan kaunter ejen. Apabila objek ejen baharu dicipta di suatu tempat dalam program, ia akan meningkat.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Tetapi ejen kami adalah rahsia! Ini bermakna hanya mereka dan tiada orang lain yang patut tahu tentang nombor mereka. Kami boleh menambahkan pengubah suai protectedpada medan agentCount, dan kemudian sama ada objek kelas ejen rahsia lain, atau kelas tersebut yang terletak dalam pakej "rahsia" kami, boleh mendapatkan nilainya top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Ia adalah untuk tugas-tugas tertentu yang pengubahsuai diperlukan protected:)

pengubah yang kelihatan pakej

Seterusnya dalam senarai kami ialah pengubah suai defaultatau, kerana ia juga dipanggil, package visible. Ia tidak ditunjukkan oleh kata kunci kerana ia ditetapkan secara lalai dalam Java untuk semua medan dan kaedah. Jika anda menulis dalam kod anda -
int x = 10;
... pembolehubah xakan mempunyai package visibleakses yang sama ini. Jika kaedah (atau pembolehubah) tidak ditandakan dengan mana-mana pengubah, ia dianggap ditandakan dengan "pengubah suai lalai". Pembolehubah atau kaedah dengan pengubah suai sedemikian (iaitu tanpa sebarang sama sekali) kelihatan kepada semua kelas pakej di mana ia diisytiharkan. Dan hanya kepada mereka. Penggunaannya adalah terhad, sama seperti pengubah suai protected. Selalunya, default-access digunakan dalam pakej yang terdapat beberapa kelas utiliti yang tidak melaksanakan fungsi semua kelas lain dalam pakej ini. Mari kita beri contoh. Bayangkan kita mempunyai pakej " perkhidmatan ". Di dalamnya terdapat pelbagai kelas yang berfungsi dengan pangkalan data. Sebagai contoh, terdapat kelas UserServiceyang membaca data pengguna daripada pangkalan data, kelas CarServiceyang membaca data tentang kereta daripada pangkalan data yang sama, dan kelas lain, setiap satunya berfungsi dengan jenis objeknya sendiri dan membaca data tentangnya daripada pangkalan data.
package services;

public class UserService {
}

package services;

public class CarService {
}
Walau bagaimanapun, situasi boleh berlaku dengan mudah apabila data dalam pangkalan data berada dalam satu format, tetapi kami memerlukannya dalam format lain. Bayangkan tarikh lahir pengguna dalam pangkalan data disimpan dalam format TIMESTAMP WITH TIME ZONE...
2014-04-04 20:32:59.390583+02
... sebaliknya kita memerlukan objek yang paling mudah - java.util.Date. Untuk tujuan ini, kita boleh mencipta serviceskelas khas di dalam pakej Mapper. Dia akan bertanggungjawab untuk menukar data dari pangkalan data ke objek Java yang kita kenali. Kelas pembantu yang mudah. Kami biasanya mencipta semua kelas sebagai public class ClassName, tetapi ini tidak perlu. Kami boleh mengisytiharkan kelas pembantu kami hanya sebagai class Mapper. Dalam kes ini, ia masih menjalankan tugasnya, tetapi tidak kelihatan kepada sesiapa di luar pakej services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Dan ini, sebenarnya, adalah logik yang betul: mengapa seseorang di luar pakej melihat kelas tambahan yang berfungsi hanya dengan kelas pakej yang sama?

pengubahsuai awam

Dan yang terakhir dalam senarai, tetapi tidak kurang pentingnya - pengubah suai public! Anda bertemu dengannya pada hari pertama belajar di JavaRush, melancarkan public static void main(String[] args). Pengubah suai akses.  Peribadi, dilindungi, lalai, awam - 4 Sekarang setelah anda mempelajari kuliah tentang antara muka, tujuannya jelas kepada anda :) Lagipun, publicia dicipta untuk memberikan sesuatu kepada pengguna. Sebagai contoh, antara muka program anda. Katakan anda menulis program penterjemah, dan ia boleh menterjemah teks Rusia ke dalam bahasa Inggeris. Anda telah mencipta kaedah translate(String textInRussian)di mana logik yang diperlukan dilaksanakan. Anda menandakan kaedah ini dengan perkataan public, dan kini ia akan menjadi sebahagian daripada antara muka:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
Anda boleh mengaitkan panggilan ke kaedah ini dengan butang "terjemah" pada skrin program - dan itu sahaja! Sesiapa sahaja boleh menggunakannya. Bahagian kod yang ditanda dengan pengubah publicadalah bertujuan untuk pengguna akhir. Untuk memberi contoh dari kehidupan, privateini adalah semua proses yang berlaku di dalam TV apabila ia berfungsi, dan publicini adalah butang pada alat kawalan jauh TV yang boleh digunakan oleh pengguna untuk mengawalnya. Pada masa yang sama, dia tidak perlu tahu cara TV berfungsi dan cara ia berfungsi. Alat kawalan jauh ialah satu set public-kaedah: on(), off(), nextChannel(), previousChannel(), increaseVolume(), decreaseVolume()dsb.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION