Halo! Dalam kuliah hari ini kita akan mengenal konsep “ pengubah akses ” dan melihat contoh cara bekerja dengannya.
Meskipun kata “ayo berkenalan” tidak sepenuhnya benar: Anda sudah familiar dengan sebagian besar kata tersebut dari perkuliahan sebelumnya. Untuk berjaga-jaga, mari segarkan ingatan kita tentang hal utama. Pengubah akses paling sering merupakan kata kunci yang mengatur tingkat akses ke berbagai bagian kode Anda. Mengapa "paling sering"? Karena salah satunya disetel secara default dan tidak ditunjukkan dengan kata kunci :) Ada total empat pengubah akses di Java. Kami mencantumkannya secara berurutan dari yang paling ketat hingga yang paling “lunak”:
![Pengubah akses. Pribadi, dilindungi, default, publik - 2]()
Bidang dan metode yang ditunjuk dengan pengubah akses
Sekarang setelah Anda mempelajari kuliah tentang antarmuka, tujuannya jelas bagi Anda :) Bagaimanapun,
- pribadi;
- terlindung;
- default(paket terlihat);
- publik.
Pengubah pribadi
![Pengubah akses. Pribadi, dilindungi, default, publik - 2](https://cdn.javarush.com/images/article/6a8c0181-8bbe-442e-b040-c74c62501986/1024.jpeg)
Private
— pengubah akses yang paling ketat. Ini membatasi visibilitas data dan metode dalam satu kelas. Anda mengetahui pengubah ini dari kuliah tentang getter dan setter. Apakah Anda 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 di salah satu artikel sebelumnya. Di sini kami membuat kesalahan serius: kami membuka data kami, akibatnya sesama pemrogram memiliki akses langsung ke bidang kelas dan mengubah nilainya. Selain itu, nilai-nilai ini ditetapkan tanpa pemeriksaan, sehingga dalam program kami dimungkinkan untuk membuat kucing dengan usia -1000 tahun, nama "" dan berat 0. Untuk mengatasi masalah ini, kami menggunakan getter dan setter , dan juga membatasi akses ke data menggunakan pengubah 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, membatasi akses ke field dan menerapkan getter-setter adalah contoh penggunaan yang paling umum private
dalam pekerjaan nyata. Artinya, mengimplementasikan enkapsulasi dalam suatu program adalah tujuan utama dari pengubah ini. Omong-omong, ini tidak hanya berlaku pada bidang. Bayangkan dalam program Anda ada metode yang mengimplementasikan beberapa fungsi yang SANGAT kompleks. Sebagai contoh... Katakanlah metode Anda readDataFromCollider()
mengambil alamat dengan data sebagai masukan, membaca data dari Large Hadron Collider dalam format byte, mengubah data ini menjadi teks, menulisnya ke file dan mencetaknya. Bahkan deskripsi metodenya terlihat menyeramkan, apalagi kodenya :) Untuk meningkatkan keterbacaan kode, sebaiknya tidak menulis logika metode yang rumit di satu tempat, tetapi sebaliknya, memecah fungsionalitas menjadi metode terpisah . Misalnya, metode ini readByteData()
bertanggung jawab untuk membaca data, convertBytesToSymbols()
mengubah data yang dibaca dari collider menjadi teks, saveToFile()
menyimpan teks yang dihasilkan ke file, dan printColliderData()
mencetak file data kita. Metodenya readDataFromCollider()
akan menjadi 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) {
// 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
}
}
Namun, seperti yang Anda ingat dari kuliah tentang antarmuka, pengguna hanya mendapat akses ke antarmuka akhir. Dan 4 metode kami bukan bagian darinya. Mereka bersifat tambahan : kami membuatnya untuk meningkatkan keterbacaan kode dan untuk menghindari menjejalkan empat tugas berbeda ke dalam satu metode. Tidak perlu memberi pengguna akses ke metode ini. Jika pengguna memiliki akses ke metode tersebut saat bekerja dengan collider convertBytesToSymbols()
, kemungkinan besar dia tidak akan memahami apa metode ini dan mengapa metode tersebut diperlukan. Berapa byte yang dikonversi? Dari mana asalnya? Mengapa mengubahnya menjadi teks? Logika yang dijalankan dalam metode ini bukan bagian dari antarmuka pengguna. Hanya metode readDataFromCollider()
yang merupakan bagian dari antarmuka. Apa yang harus dilakukan dengan keempat metode "internal" ini? Benar! Batasi akses ke sana dengan pengubah private
. Dengan cara ini mereka dapat dengan mudah melakukan pekerjaannya di dalam kelas dan tidak membingungkan pengguna, yang tidak memerlukan logika masing-masing secara terpisah.
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 dilindungi
Pengubah akses paling ketat berikutnya adalahprotected
. ![Pengubah akses. Pribadi, dilindungi, default, publik - 3](https://cdn.javarush.com/images/article/8d4b98ea-fbf8-4bd6-89ff-7447166ab7c7/1024.jpeg)
protected
akan terlihat:
- dalam semua kelas yang berada dalam paket yang sama dengan kita;
- dalam semua kelas penerus kelas kami.
protected
kasus penerapannya jauh lebih sedikit dibandingkan private
, dan kasusnya spesifik. Bayangkan kita memiliki kelas abstrak AbstractSecretAgent
yang menunjukkan agen rahasia dari suatu badan intelijen, serta paket top_secret
yang berisi kelas ini dan turunannya. Kelas konkrit - FBISecretAgent
, MI6SecretAgent
, MossadSecretAgent
dll. - diwarisi darinya. Di dalam kelas abstrak kami ingin mengimplementasikan penghitung agen. Ketika objek agen baru dibuat di suatu tempat dalam program, objek tersebut akan bertambah.
package top_secret;
public abstract class AbstractSecretAgent {
public static int agentCount = 0;
}
Tapi agen kami rahasia! Artinya hanya mereka dan tidak ada orang lain yang boleh mengetahui nomor mereka. Kita dapat dengan mudah menambahkan pengubah protected
ke bidang agentCount
, dan kemudian objek dari kelas agen rahasia lainnya, atau kelas yang ada di paket "rahasia" kita, bisa mendapatkan nilainya top_secret
.
public abstract class AbstractSecretAgent {
protected static int agentCount = 0;
}
Untuk tugas spesifik seperti itulah pengubah diperlukan protected
:)
pengubah paket yang terlihat
Berikutnya dalam daftar kami adalah pengubahdefault
atau, disebut juga, package visible
. Itu tidak ditunjukkan dengan kata kunci karena diatur secara default di Java untuk semua bidang dan metode. Jika Anda menulis dalam kode Anda -
int x = 10;
... variabel x
akan memiliki akses yang sama package visible
. Jika suatu metode (atau variabel) tidak ditandai dengan pengubah apa pun, maka dianggap ditandai dengan "pengubah default". Variabel atau metode dengan pengubah seperti itu (yaitu tanpa pengubah sama sekali) dapat dilihat oleh semua kelas paket di mana variabel atau metode tersebut dideklarasikan. Dan hanya untuk mereka. Kegunaannya terbatas, sama seperti modifikator protected
. Paling sering, default
-access digunakan dalam sebuah paket di mana terdapat beberapa kelas utilitas yang tidak mengimplementasikan fungsionalitas semua kelas lain dalam paket ini. Mari kita beri contoh. Bayangkan kita mempunyai paket " layanan ". Di dalamnya terdapat berbagai kelas yang bekerja dengan database. Misalnya, ada kelas UserService
yang membaca data pengguna dari database, kelas CarService
yang membaca data tentang mobil dari database yang sama, dan kelas lain, yang masing-masing bekerja dengan tipe objeknya sendiri dan membaca data tentang objek tersebut dari database.
package services;
public class UserService {
}
package services;
public class CarService {
}
Namun, situasi dapat dengan mudah terjadi ketika data dalam database berada dalam satu format, namun kita membutuhkannya dalam format lain. Bayangkan tanggal lahir pengguna di database disimpan dalam format TIMESTAMP WITH TIME ZONE...
2014-04-04 20:32:59.390583+02
...kita malah membutuhkan objek yang paling sederhana - java.util.Date
. Untuk tujuan ini, kita dapat membuat services
kelas khusus di dalam paket Mapper
. Dia akan bertanggung jawab untuk mengubah data dari database menjadi objek Java yang kita kenal. Kelas pembantu sederhana. Kami biasanya membuat semua kelas sebagai public class ClassName
, tapi ini tidak perlu. Kita dapat mendeklarasikan kelas pembantu kita hanya sebagai class Mapper
. Dalam hal ini, ia masih melakukan tugasnya, tetapi tidak terlihat oleh siapa pun di luar paket services
!
package services;
class Mapper {
}
package services;
public class CarService {
Mapper mapper;
}
Dan ini sebenarnya logika yang benar: mengapa seseorang di luar paket melihat kelas tambahan yang hanya bekerja dengan kelas dari paket yang sama?
pengubah publik
Dan yang terakhir dalam daftar, namun tidak kalah pentingnya - pengubahpublic
! Anda bertemu dengannya di hari pertama belajar di JavaRush, meluncurkan public static void main(String[] args)
. ![Pengubah akses. Pribadi, dilindungi, default, publik - 4](https://cdn.javarush.com/images/article/4323b90c-193c-444c-88e4-cfd8af695107/1024.jpeg)
public
ini dibuat untuk memberikan sesuatu kepada pengguna. Misalnya, antarmuka program Anda. Katakanlah Anda menulis sebuah program penerjemah, dan program tersebut dapat menerjemahkan teks Rusia ke bahasa Inggris. Anda telah membuat metode translate(String textInRussian)
di mana logika yang diperlukan diterapkan. Anda menandai metode ini dengan kata public
, dan sekarang metode ini akan menjadi bagian dari antarmuka:
public class Translator {
public String translate(String textInRussian) {
// translates text from Russian to English
}
}
Anda dapat mengaitkan panggilan ke metode ini dengan tombol "terjemahkan" di layar program - dan selesai! Siapa pun dapat menggunakannya. Bagian kode yang ditandai dengan pengubah public
ditujukan untuk pengguna akhir. Sebagai contoh dari kehidupan, private
ini adalah semua proses yang terjadi di dalam TV saat TV berfungsi, dan public
ini adalah tombol-tombol pada remote control TV yang dapat digunakan pengguna untuk mengontrolnya. Pada saat yang sama, dia tidak perlu mengetahui cara kerja TV dan cara kerjanya. Remote control adalah seperangkat public
-metode: on()
, off()
, nextChannel()
, previousChannel()
, increaseVolume()
, decreaseVolume()
dll.
GO TO FULL VERSION