Apakah Java memiliki pengubah akses “private protected”?

160

Saya telah melihat beberapa referensi merujuk ke pengubah akses di Java disebut private protected(kedua kata bersama):

private protected someMethod() {

}

Salah satu halaman yang saya temukan merujuk ke sini . Pelajaran sekolah saya juga merujuk pada pengubah akses ini (dan mengatakan itu ada). Namun, menggunakannya menghasilkan kesalahan dalam bahasa Java.

Saya mencoba dengan kedua variabel dan metode dan saya cukup yakin itu tidak ada, tetapi saya ingin penjelasan tentang apa yang terjadi. Apakah itu dianggap, lalu ditolak? Atau apakah itu bisa dihapus di versi Java yang lebih baru?

Sunting: Saya tidak mencari info tentang protectedkata kunci.


sumber
60
Halaman yang Anda temukan menetapkan tajuk HTTP "Terakhir Dimodifikasi" dari: Senin, 26 Feb 1996 18:14:04 GMT!
G. Sylvie Davies
6
@ Jo, saya semua untuk menutup pertanyaan sebagai dupes bila memungkinkan, tapi saya tidak melihat apa - apa tentang private protectedpengubah gabungan di sana.
jpmc26
2
@ jpmc26 Lihat "Di Java 1.0 ada pengubah akses tambahan, yang dilindungi pribadi." Namun, jawabannya di sini adalah ringkasan yang jauh lebih baik dari sejarah.
Joe
2
@ Jo memang memang ada referensi private protecteddalam jawaban itu, tapi itu tidak menjelaskan mengapa atau apa yang terjadi padanya, yang menjadi tujuan pertanyaan ini.
m0skit0
3
Apakah ada orang lain yang merasa takut bahwa OP mempelajari ini di sekolah .... lebih dari 20 tahun setelah dikeluarkan dari Documents? Pelajaran sejarah yang menarik, tetapi masih agak menakutkan bahwa orang-orang mempelajari sesuatu yang dihapus sebelum Java 1 dinamai ...
XaolingBao

Jawaban:

191

Penghapusan pengubah akses

Java memang memiliki private protectedmodifier, tetapi telah dihapus di JDK 1.0.2 ( versi stabil pertama , Java 1.0 yang kita kenal sekarang). Beberapa tutorial tentang JDK 1.0.2 (di sini dan di sini ) mengatakan hal berikut:

Catatan: Rilis 1.0 bahasa Java mendukung lima tingkat akses: empat yang tercantum di atas plus private protected. The private protectedtingkat akses tidak didukung dalam versi yang lebih tinggi Jawa dari 1,0; Anda seharusnya tidak lagi menggunakannya di program Java Anda.

Jawaban lain tentang SoftwareEngineering.SE menyatakan:

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

Sekarang lihat Sejarah Versi Java :

JDK 1.0

Versi pertama dirilis pada 23 Januari 1996 dan disebut Oak. Versi stabil pertama, JDK 1.0.2, disebut Java 1.

Dari ini, kita dapat menyimpulkan tutorial tentang versi 1.0.2 merujuk ke versi pertama, JDK 1.0, di mana bahasa itu disebut Oak, tetapi yang dari SoftwareEngineering.SE merujuk ke versi stabil pertama, JDK 1.0.2 disebut Java 1.0, tempat dihapus.

Sekarang jika Anda mencoba mencarinya di dokumentasi Java 1.0 , Anda tidak akan menemukannya, karena seperti yang disebutkan sebelumnya, itu telah dihapus di JDK 1.0.2, atau dikenal sebagai Java 1.0. Ini terbukti lagi ketika Anda melihat waktu "Terakhir Dimodifikasi" untuk tautan yang Anda poskan. Tautan yang Anda poskan terakhir kali dimodifikasi pada bulan Februari 1996. Java 1.0 / JDK 1.0.2, ketika private protecteddihapus, dirilis setelah Februari 1996 , dan sesuai dengan spesifikasi, Agustus 1996.

Alasan untuk dihapus

Beberapa sumber juga menjelaskan alasannya private protected, seperti ini . Kutipan:

Apa yang dilindungi pribadi?

Sejak awal, bahasa Jawa memungkinkan kombinasi pengubah tertentu, salah satunya private protected. Arti private protectedadalah untuk membatasi visibilitas hanya untuk subclass (dan menghapus akses paket). Ini kemudian dianggap agak tidak konsisten dan terlalu rumit dan tidak lagi didukung. [5]

[5] Arti protectedpengubah berubah dalam rilis Beta2 Java, dan private protectedkombinasi muncul pada saat yang sama. Mereka menambal beberapa lubang keamanan potensial, tetapi membingungkan banyak orang.

Dan SoftwareEngineering.SE juga mendukung ini, dengan mengatakan bahwa itu tidak sebanding dengan ketidakkonsistenan dan kompleksitas tambahan, jadi sudah dihapus sejak dini.

Penafsiran

Penafsiran saya tentang semua ini adalah bahwa mungkin, pada masa Oak, keduanya diizinkan untuk hidup berdampingan (karenanya kombinasinya). Karena protectedmakna telah berubah 1 , mungkin ada kebutuhan untuk mengizinkan privatedan protectedpada saat yang sama. Pendahuluan menjadi terlalu rumit dan tidak layak, dan akhirnya dibatalkan. Pada saat Java 1.0 / JDK 1.0.2 bergulir, itu telah jatuh dan dengan demikian tidak dapat ditemukan dalam dokumentasi.


1 Dalam Spesifikasi Bahasa Oak , Bagian 4.10, Akses ke Variabel dan Metode , perlu dicatat bahwa pengubah default adalah protected:

Secara default semua variabel dan metode dalam kelas dilindungi .

Ini sangat berbeda dari apa yang kita miliki hari ini, akses paket default. Ini mungkin telah membuka jalan bagi kebutuhan private protected, karena privateterlalu membatasi dan protectedterlalu lunak.

Andrew Li
sumber
Saya yakin itu tidak bernilai banyak - tetapi saya ingat ketika itu terjadi (saya pemrograman sebagai seorang anak dan sangat menyukai hal Java baru ini untuk beberapa alasan) dan sementara saya tidak dapat menemukan sumber asli - saya ingat hal-hal persis seperti ini ketika saya mengikuti mereka.
Benjamin Gruenbaum
Early on, the Java language allowed for certain combinations of modifiers, Apakah itu berarti ada lebih dari sekadar "Perlindungan Pribadi?"
XaolingBao
@ XaolingBao Ya tentu saja, satu accessor tidak seperti accesor :) Tautan yang disediakan harus menjelaskan pertanyaan Anda.
m0skit0
52

Ada cerita yang membingungkan / tidak jelas:

Satu, dari sumber Princeton yang Anda masukkan, dan juga dari arsip MIT , menyatakan bahwa:

Catatan: Rilis 1.0 bahasa Java mendukung lima tingkat akses: empat yang terdaftar di atas ditambah pribadi yang dilindungi. Level akses yang dilindungi pribadi tidak didukung dalam versi Java yang lebih tinggi dari 1.0; Anda seharusnya tidak lagi menggunakannya di program Java Anda.

Tetapi fitur ini tidak ditentukan pada dokumentasi resmi untuk Java 1.0 di sini atau di sini .

Dugaan saya adalah bahwa fitur ini tidak masuk ke versi 1.0 resmi, karena spesifikasi bahasa resmi adalah dari Agustus 1996 dan sumber Princeton terakhir dimodifikasi pada Februari 1996 .

PS: malu pada Oracle karena menghapus arsip untuk versi yang lebih lama.

m0skit0
sumber
jadi apakah tautan saya merupakan versi lama dari konten yang sama? : D
Mungkin informasi yang hilang ada hubungannya dengan catatan yang Anda masukkan.
@AndrewLi Nowhere tidak dinyatakan stabil pada referensi yang diberikan. Dan jelas membingungkan untuk merujuk ke 1.0.2 sebagai 1.0 ketika ada 1.0 yang sebenarnya.
m0skit0
10

Seperti tautan yang Anda berikan dalam pertanyaan Anda menyarankan private protecteddigunakan pada element/memberkelas, ketika Anda ingin Anda subclassdapat mengakses elemen tetapi tetap tersembunyi dari kelas lain di dalamnya package.

Javajika dibandingkan dengan C++memiliki konsep tambahan elemen enkapsulasi - dan itu adalah Paket . Orang juga harus memahami apa yang dapat diakses di dalam atau di luar paket Javaketika datang ke penentu akses seperti private, public& protected.

Harap dicatat bahwa saya telah menjelaskan mengapa ini digunakan. Tidak dalam versi saat ini, tentu saja

programmer_of_the_galaxies
sumber
Tautan saya adalah untuk akses metode. Bukan akses anggota.
1
@MarkYisri juga dapat digunakan untuk variabel anggota. specifier akses tidak hanya bekerja pada metode tetapi juga pada vars anggota. Dengan kata lain, penentu akses adalah konsep enkapsulasi & terlepas dari apakah Anda menerapkannya pada metode anggota atau variabel anggota. yang berlaku untuk hampir semua bahasa berorientasi objek termasuk C ++ & java
programmer_of_the_galaxies
Oke, tapi tutorialnya (menariknya) tidak menyebutkan private protected pada variabel. Tunggu dan biarkan saya melihat apakah ada halaman variabel ...
0

Tidak, Anda tidak dapat menggunakan keduanya privatesecara protectedbersamaan. Tutorial Anda aneh. Apa yang Anda miliki disebut paket pribadi atau di akses referensi paket terproteksi ot6. Ini adalah akses default yang diaktifkan ketika tidak ada kualifikasi acc6 yang ditulis secara eksplisit.

AlexR
sumber
3
Saya sadar Anda tidak bisa menggunakannya. Saya ingin tahu apa yang terjadi padanya, yang jawaban lainnya menjelaskan lebih baik.
4
Ya, tautannya dari tahun 1996 sehingga mengingat bahwa pembangunan Jawa baru saja dimulai sekitar setahun sebelumnya, isi tautannya tidak terlalu aneh: D
Keiwan
6
Poin bagus tentang tanggal dokumen dokumen. Saya menjawab pertanyaan ketika kereta saya tiba dan menulisnya menggunakan telepon, sangat menyesal jika jawabannya tidak cukup tergelincir. Hanya ingin membantu ...
AlexR
6
@AlexR kesalahan ejaan Anda tergelincir sebenarnya adalah permainan kata-kata (kereta). Hanya memperhatikan. : D
1
@MarkYisri, terperinci. Menulis menggunakan ponsel bukanlah cara terbaik untuk mengirim jawaban di SO.
AlexR
-2

Ruang lingkup privat menyertai kelas yang ada. Dimana Protected dapat diakses dalam paket dan kelas yang diperluas oleh kelas-kelas dalam paket lain.

Mulus jika Anda ingin variabel / metode Anda menjadi akses di luar paket Anda perlu mendefinisikan sebagai dilindungi / publik jika tidak pribadi atau beberapa penentu akses lainnya.

Metode yang dilindungi biasanya dapat diakses dari paket luar dan dalam sub-kelas, yaitu kelas harus memperluas kelas masing-masing untuk memanfaatkan metode yang didefinisikan dilindungi.

Metode / variabel pribadi memiliki ruang lingkup di dalam kelas. Mereka tidak dapat diakses di luar kelas.

Karenanya Anda tidak dapat mendefinisikan Privat Dilindungi pada saat yang sama!

Tejas Gowda
sumber
Ini tidak menjawab pertanyaan. Saya bertanya mengapa itu tidak berhasil. Jawaban lain melakukan pekerjaan yang jauh lebih baik dalam menjawab pertanyaan.
Untuk memperjelas lebih lanjut, saya tahu itu tidak lagi berfungsi sekarang, tetapi jawaban yang lain menjelaskan mengapa dan apa yang terjadi di masa lalu. Milikmu tidak.