Mengapa tidak ada pengubah akses 'hanya subkelas' di Java?

16

Di Jawa, ada empat pengubah akses yang tersedia untuk metode:

public - kelas apa pun dapat menggunakan metode ini.

protected - kelas dalam paket yang sama dan subclass dalam paket apa pun dapat menggunakan metode ini.

private - hanya kelas ini yang bisa menggunakan metode ini.

no modifier ("paket pribadi") - hanya kelas dalam paket yang sama yang dapat menggunakan metode ini.

Yang sering terjadi adalah saya ingin memiliki metode yang berguna dalam superclass, yang dapat digunakan semua subclass. Tetapi tidak masuk akal bagi kelas lain untuk mengakses metode ini, dan dalam arti itu akan memecah enkapsulasi.

Jadi saya harus mendeklarasikan metode yang berguna ini di superclass publicatau protected, yang memaparkannya ke semua kelas lain setidaknya dalam paket. Meskipun mereka hanya dimaksudkan untuk digunakan oleh subclass.

Apakah ada alasan mengapa tidak ada subclasses-onlypengubah akses di Java? Sepertinya sangat aneh bagi saya. Apakah saya melewatkan sesuatu?

Juga, subclasses-onlypengubah akses juga akan berguna ketika Anda ingin mengekspos variabel hanya ke subclass. Yang menurut saya sering terjadi.

Aviv Cohn
sumber

Jawaban:

10

Karena Anda dapat meniru pengubah hanya-subkelas dengan menggunakan pengubah yang dilindungi dan memastikan bahwa hanya kelas induk dan subkelasnya dalam paket yang sama.

Ini memang praktik yang baik, karena paket tidak hanya membantu untuk mengatur proyek besar dalam hal kohesi, tetapi mereka juga menunjukkan bahwa kelas-kelas dalam paket yang sama mungkin memiliki beberapa tingkat penggabungan.

Tércio de Almeida
sumber
15
"dan menegakkan bahwa hanya kelas induk dan subkelasnya dalam paket yang sama" - Sekarang, bagaimana kita melakukan itu ?!
JimmyB
1
Dan kemudian Anda tidak dapat menggunakan pengubah akses hanya-paket. Dan Anda membutuhkan sejumlah paket konyol. Ini bukan solusi praktis.
user253751
13

Java awalnya memiliki pengubah seperti itu. Itu ditulis private protectedtetapi dihapus di Jawa 1.0.

Saya berasumsi itu adalah panggilan penilaian bahwa kompleksitas tambahan tidak sebanding dengan biayanya.

Setiap fitur bahasa memiliki biaya: dalam mengajarkannya kepada programmer baru; dalam dokumentasi; dalam mengimplementasikannya di compiler, JVM, dan alat dev; dalam penalaran tentang kebenaran program; dalam membatasi evolusi bahasa di masa depan; dan lainnya. Fitur bahasa berinteraksi satu sama lain, berpotensi dengan interaksi N 2 .

Berapa persen programmer Java yang membaca spesifikasi bahasa Jawa dan spesifikasi VM? Saya yakin itu persentase kecil, yang berpendapat untuk bahasa yang lebih sederhana demi pemahaman dan rekayasa produk yang bisa kita andalkan

Keuntungan dari private protectedfitur ini kecil karena paket adalah unit utama dari modularitas.

Jerry101
sumber
1
jadi ada versi Java sebelum 1.0?
Mark Yisri
1
@MarkYisri Java memiliki rilis alpha dan beta publik pada tahun 1995, dan sedikit kode yang ditulis terhadap mereka.
David Moles
4

Kontrol akses dapat dianggap sebagai hasil dari peliputan dengan pengembang imajiner yang bekerja dengan kelas Anda tentang metode dan properti kelas ...

ANDA: Katakan Anda ingin melakukan x, Anda memanggil metode doX .. DEV: Ceritakan lebih lanjut..apa argumennya?

Ini publik ...

ANDA: Di dalam doX saya sebut ... DEV: Whoa, terlalu banyak informasi, saya tidak peduli tentang itu. Saya hanya ingin tahu cara menggunakannya. Ceritakan yang lain.

Ini pribadi ...

ANDA: Ketika subklas, saya punya doX dan doY memanggil doit yang berfungsi .. DEV: Ya, saya akan subkelas, ceritakan lebih lanjut ...

Ini dilindungi ...

ANDA: Saya akan pergi berlibur dalam satu jam, saya akan pergi selama 6 bulan ke depan. Bos mengatakan anak anjing ini milikmu! Sampai jumpa. DEV: Tunggu, jangan pergi dulu, ceritakan semuanya ...

Ini paket.

ANDA: Metode doItWhen hanya dipanggil oleh kelas ini dan itu tidak berubah dalam sepuluh tahun. Itu ... DEV: Whoa, kita tinggal 50 menit. Properti selanjutnya, dan bicara lebih cepat.

Ini dilindungi pribadi ...

jmoreno
sumber
3

Ini sudah ada. Itu dilindungi.

Anda memiliki kontrol atas kelas apa yang ada dalam paket. Jika tidak ada kelas lain dalam paket dan variabel atau metode yang diberikan dilindungi, itu adalah 'hanya subkelas'.

Yang mengatakan, sekali lagi, Anda memiliki kendali atas kelas apa yang ada dalam paket. Anda dapat memilih untuk tidak menggunakan metode atau variabel yang dilindungi.


sumber
3
Terlepas dari paket sistem khusus yang dicadangkan, tidak bisakah saya menambahkan kelas ke paket apa pun, bahkan salah satu dari Anda yang tidak ingin saya tambahkan kelas?
David Moles
@ David IIRC ya, tapi itu tidak akan membiarkan Anda mengakses bidang paket dari JAR lain jadi bahkan jika Anda memasukkannya ke dalam paket yang sama, jika itu dalam JAR lain Anda tidak dapat mengaksesnya. Namun, jika Anda merujuk ke dalam JAR yang sama, maka ya, Anda dapat mengaksesnya, tetapi jika Anda dapat memodifikasi JAR yang dimaksud, Anda dapat dengan mudah mengubah pengubah akses.
Pokechu22
1
@ Pokechu22 Saya pikir Anda harus dengan tegas menyegel JAR untuk mendapatkan perlindungan itu, tapi bagus.
David Moles