Siapa yang Boleh Menyentuh Kodemu
Access modifier adalah kata kunci di depan class, field, method, atau constructor yang menentukan siapa lagi yang boleh memakainya. Ini adalah fondasi enkapsulasi: kamu menyembunyikan detail internal sebuah class yang rumit dan hanya membuka bagian yang kamu percayakan untuk dipanggil oleh kode lain.
Java punya empat level, dari yang paling terbuka sampai yang paling tertutup: public, protected, default (tanpa kata kunci sama sekali), dan private. Kalau keempatnya kamu pakai dengan tepat, sebuah class tetap aman untuk diubah nanti, karena tidak ada kode di luar yang bergantung pada detail yang memang tidak pernah kamu janjikan untuk dipertahankan.
private: Hanya Terlihat di Dalam Class
private adalah level paling ketat. Member private hanya bisa disentuh oleh kode yang ditulis di dalam class yang sama. Subclass tidak bisa, class lain di package yang sama juga tidak, siapa pun tidak bisa. Di sinilah sebagian besar field-mu seharusnya berada.
balance bersifat private, jadi satu-satunya cara mengubahnya adalah lewat deposit, yang menolak jumlah negatif. Kalau balance bersifat public, kode mana pun bisa menulis account.balance = -9999 dan melewati pemeriksaan itu begitu saja. Pengaman itulah alasan utama field-nya disembunyikan.
Coba hapus tanda komentar pada account.balance = 500; di main, maka kamu akan mendapat error kompilasi: balance has private access in BankAccount.
public: Terlihat di Mana Saja
public adalah kebalikannya: siapa pun, di mana pun, bisa memakai member itu. Nama method yang memang dimaksudkan untuk dipanggil oleh kode lain biasanya public. Begitu juga class-nya sendiri, kalau class itu perlu bisa dijangkau dari package lain.
Pola yang umum, kadang disebut public API sebuah class, adalah field private, method public. Field menyimpan state yang tidak boleh diutak-atik pihak lain, sedangkan method menjadi pintu masuk dan keluar yang terkendali. getBalance dan deposit di atas adalah contoh persisnya.
default (Package-Private): Tanpa Kata Kunci Sama Sekali
Kalau kamu tidak menulis modifier apa pun, kamu mendapat akses default, disebut juga package-private. Member itu terlihat oleh setiap class di package yang sama dan tidak terlihat oleh apa pun di luarnya. Tidak ada kata kunci untuk level ini: justru ketiadaan kata kunci itulah level-nya.
class Invoice { // no modifier -> visible only within this package
int amount; // no modifier -> package-private field
}
Ini sering menjebak pemula: tidak menulis public tidak membuat sesuatu menjadi private, melainkan package-private. Field yang maksudnya ingin kamu rahasiakan tetap bisa dibaca dan ditulis sepenuhnya oleh class mana pun yang kebetulan berada di package yang sama. Kalau kamu ingin benar-benar menyembunyikannya, kamu harus menulis private secara eksplisit.
Akses default sangat berguna untuk class pembantu yang merupakan detail implementasi dari satu package. Kamu tidak mengekspornya, tetapi class yang bekerja sama di dalam package itu tetap bisa memakainya dengan bebas.
protected: Package Ditambah Subclass
protected satu tingkat lebih longgar daripada default. Member protected terlihat di semua tempat yang bisa dijangkau default (package yang sama), dan juga oleh subclass, bahkan subclass di package lain. Level ini dirancang untuk hal yang ingin kamu bagikan dengan class yang meng-extend class-mu, tetapi tidak dengan seluruh dunia.
Dog bisa menjangkau name dan sound() karena keduanya protected dan Dog adalah subclass. Kode luar yang bukan subclass dan tidak berada di package itu tetap tidak bisa menyentuhnya. Pakai protected saat kamu merancang class yang memang dimaksudkan untuk di-extend; selain itu, lebih baik pakai private.
Ringkasan Empat Level
Berikut gambaran lengkapnya, dari yang paling ketat sampai yang paling terbuka:
| Modifier | Class yang sama | Package yang sama | Subclass (package lain) | Di mana saja |
|---|---|---|---|---|
private | ya | tidak | tidak | tidak |
| default | ya | ya | tidak | tidak |
protected | ya | ya | ya | tidak |
public | ya | ya | ya | ya |
Aturan praktis yang sederhana: mulailah dengan private dan longgarkan hanya kalau sesuatu memang butuh akses yang lebih luas. Melebarkan akses nanti jauh lebih mudah daripada mempersempitnya setelah kode lain mulai bergantung pada sebuah member.
Modifier pada Class Itu Sendiri
Access modifier juga berlaku untuk class, bukan hanya member. Namun class top-level (class yang tidak bersarang di dalam class lain) hanya bisa public atau default. Kamu tidak bisa menulis class top-level yang private atau protected.
public class Order { ... } // reachable from any package
class LineItem { ... } // default - only this package can see it
Class top-level yang public harus berada di file yang namanya sama dengan class itu (Order.java). Sebaliknya, nested class bisa memakai keempat modifier, itulah sebabnya contoh-contoh di atas bisa menandai inner class sebagai private atau default. Satu hal yang halus: method public yang mengembalikan tipe package-private tidak terlalu berguna bagi pemanggil dari luar, jadi jagalah agar bagian publik class-mu konsisten.
Berikutnya: Static Member
Sejauh ini setiap field dan method di sini milik sebuah instance: kamu membuat objek dengan new, lalu memanggil method pada objek itu. Tetapi kadang sebuah nilai atau perilaku menjadi milik class secara keseluruhan dan dipakai bersama oleh semua instance, misalnya penghitung jumlah objek yang sudah dibuat. Untuk itulah kata kunci static ada, dan itu topik berikutnya.
Pertanyaan yang sering diajukan
Apa saja empat access modifier di Java?
public, private, protected, dan default (tanpa kata kunci, disebut juga package-private). public terlihat di mana saja, private hanya di dalam class yang sama, protected di dalam package ditambah subclass, dan default hanya di dalam package yang sama.
Apa perbedaan public dan private di Java?
public berarti kode mana pun, di mana pun, bisa mengakses member itu. private berarti hanya kode di dalam class yang sama yang bisa mengaksesnya: subclass dan class lain bahkan tidak bisa melihatnya. Biasanya field dibuat private lalu dibuka lewat method public.
Apa artinya kalau sebuah field Java tidak punya access modifier?
Tanpa kata kunci berarti akses default (package-private): member itu terlihat oleh setiap class di package yang sama, tetapi tidak terlihat dari luar package. Aksesnya lebih ketat daripada public tetapi lebih longgar daripada private. Level ini gampang terpakai tanpa sengaja, jadi pakailah dengan sadar.