Java มีตัวดัดแปลงการเข้าถึง "ส่วนตัวที่ได้รับการป้องกัน" หรือไม่?


160

ฉันเห็นการอ้างอิงบางอย่างอ้างถึงตัวดัดแปลงการเข้าถึงใน Java ที่เรียกว่าprivate protected(ทั้งสองคำพร้อมกัน):

private protected someMethod() {

}

หนึ่งของหน้าเว็บที่ผมพบว่าหมายถึงนี้ก็คือที่นี่ บทเรียนโรงเรียนของฉันยังอ้างถึงตัวดัดแปลงการเข้าถึงนี้ (และบอกว่ามีอยู่) อย่างไรก็ตามการใช้มันส่งผลให้เกิดข้อผิดพลาดในภาษา Java

ฉันลองทั้งตัวแปรและวิธีการและฉันค่อนข้างแน่ใจว่ามันไม่มีอยู่จริง แต่ฉันต้องการคำอธิบายว่าเกิดอะไรขึ้น มันถูกพิจารณาแล้วถูกปฏิเสธ? หรือมันถูกลบออกใน Java เวอร์ชันใหม่กว่า?

แก้ไข: ฉันไม่ต้องการข้อมูลเกี่ยวกับprotectedคำหลัก


60
หน้าเว็บที่คุณพบตั้งส่วนหัว HTTP "แก้ไขครั้งสุดท้าย" ของ: จันทร์, 26 กุมภาพันธ์ 2539 18:14:04 GMT!
G. Sylvie Davies

6
@ โจฉันทุกคนสำหรับคำถามที่ปิดเป็นสองเท่าเมื่อเป็นไปได้ แต่ฉันไม่เห็นอะไรเกี่ยวกับการprivate protectedปรับปรุงรวมอยู่ในนั้น
jpmc26

2
@ jpmc26 ดูที่ "ใน Java 1.0 มีตัวแก้ไขการเข้าถึงเพิ่มเติมได้รับการป้องกันแบบส่วนตัว" อย่างไรก็ตามคำตอบที่นี่เป็นบทสรุปที่ดีกว่าของประวัติศาสตร์
Joe

2
@ โจมีการอ้างอิงถึงprivate protectedคำตอบนั้น แต่ก็ไม่ได้อธิบายว่าทำไมหรือเกิดอะไรขึ้นกับมันซึ่งคำถามนี้เกี่ยวกับอะไร
m0skit0

3
มีใครอีกบ้างที่เห็นว่าน่ากลัวว่า OP กำลังเรียนรู้สิ่งนี้ในโรงเรียน .... มากกว่า 20 ปีหลังจากที่ถูกลบออกจากเอกสารหรือไม่ บทเรียนประวัติศาสตร์ที่น่าสนใจ แต่ก็ยังน่ากลัวนิดหน่อยที่ผู้คนกำลังเรียนรู้บางสิ่งที่ถูกลบไปก่อนชื่อ Java 1 ...
XaolingBao

คำตอบ:


191

การลบตัวดัดแปลงการเข้าถึง

แรกเริ่ม Java นั้นมีprivate protectedตัวดัดแปลง แต่มันถูกลบออกใน JDK 1.0.2 ( เวอร์ชันที่เสถียรแรกคือ Java 1.0 ที่เรารู้จักในปัจจุบัน) บทแนะนำเล็กน้อยเกี่ยวกับ JDK 1.0.2 ( ที่นี่และที่นี่ ) พูดต่อไปนี้:

หมายเหตุ: 1.0 เปิดตัวของภาษา Java สนับสนุนห้าระดับการเข้าถึง: private protectedที่ระบุไว้ข้างต้นบวกสี่ private protectedระดับการเข้าถึงไม่ได้รับการสนับสนุนในรุ่นของ Java สูงกว่า 1.0; คุณไม่ควรใช้มันในโปรแกรม Java ของคุณอีกต่อไป

คำตอบอื่น ๆเกี่ยวกับ SoftwareEngineering.SEระบุ:

Java เดิมมีตัวดัดแปลงดังกล่าว มันถูกเขียนprivate protectedแต่ลบออกใน Java 1.0

ตอนนี้มาดูประวัติของJava Version :

JDK 1.0

รุ่นแรกเปิดตัวเมื่อวันที่ 23 มกราคม 1996และเรียกว่าโอ๊ค JDK 1.0.2 เวอร์ชั่นเสถียรแรกเรียกว่า Java 1

จากนี้เราสามารถสรุปบทเรียนเกี่ยวกับรุ่น 1.0.2 อ้างถึงรุ่นแรกมาก JDK 1.0 ซึ่งภาษาถูกเรียกว่า Oak แต่หนึ่งใน SoftwareEngineering.SE หมายถึงรุ่นมั่นคงแรก JDK 1.0.2 เรียก Java 1.0 ซึ่งถูกลบ

ตอนนี้ถ้าคุณพยายามค้นหาในเอกสารคู่มือJava 1.0คุณจะไม่พบมันเพราะอย่างที่กล่าวไปแล้วมันถูกลบใน JDK 1.0.2 หรือที่เรียกว่า Java 1.0 สิ่งนี้ได้รับการพิสูจน์อีกครั้งเมื่อคุณดูเวลา "แก้ไขครั้งล่าสุด" สำหรับลิงค์ที่คุณโพสต์ ลิงก์ที่คุณโพสต์ได้รับการแก้ไขครั้งล่าสุดในเดือนกุมภาพันธ์ปี 1996 Java 1.0 / JDK 1.0.2 เมื่อprivate protectedถูกลบออกได้รับการปล่อยตัวหลังจากเดือนกุมภาพันธ์ปี 1996และเป็นไปตามข้อกำหนดของเดือนสิงหาคมปี 1996

เหตุผลในการกำจัด

บางแหล่งข่าวยังอธิบายเหตุผลในการprivate protectedเช่นนี้อย่างใดอย่างหนึ่ง อ้างถึง:

ส่วนตัวได้รับการคุ้มครองอะไรบ้าง

ในช่วงต้นของภาษา Java private protectedได้รับอนุญาตให้บางอย่างรวมกันของการปรับเปลี่ยนซึ่งหนึ่งในนั้นคือ ความหมายของprivate protectedคือการ จำกัด การมองเห็นอย่างเคร่งครัดกับคลาสย่อย (และลบการเข้าถึงแพคเกจ) หลังจากนี้ถือว่าค่อนข้างไม่สอดคล้องกันและซับซ้อนเกินไปและไม่สนับสนุนอีกต่อไป [5]

[5] ความหมายของโมดิprotectedฟายเออร์มีการเปลี่ยนแปลงใน Java รุ่นเบต้า 2 และprivate protectedชุดค่าผสมจะปรากฏขึ้นพร้อมกัน พวกเขาปะรูโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นได้

และ SoftwareEngineering.SE ยังสนับสนุนสิ่งนี้โดยบอกว่ามันไม่คุ้มกับความไม่สอดคล้องและความซับซ้อนที่เพิ่มขึ้นดังนั้นมันจึงถูกลบออกไปก่อน

การตีความ

การตีความของฉันทั้งหมดนี้คือบางทีย้อนกลับไปในยุคโอ๊กทั้งคู่ได้รับอนุญาตให้อยู่ร่วมกัน (ดังนั้นการรวมกัน) ตั้งแต่protectedความหมายเปลี่ยนไป1อาจมีความจำเป็นในการอนุญาตprivateและprotectedในเวลาเดียวกัน การแนะนำเริ่มซับซ้อนเกินไปและไม่คุ้มค่าและถูกทิ้งไว้ในที่สุด เมื่อถึงเวลา Java 1.0 / JDK 1.0.2 จะถูกลบทิ้งและไม่พบในเอกสารประกอบ


1ในข้อกำหนดภาษาของ Oakส่วนที่ 4.10 การเข้าถึงตัวแปรและวิธีการมีการบันทึกไว้ว่าตัวดัดแปลงเริ่มต้นคือprotected:

โดยค่าเริ่มต้นตัวแปรทั้งหมดและวิธีการในชั้นเรียนจะได้รับการคุ้มครอง

สิ่งนี้ค่อนข้างแตกต่างจากสิ่งที่เรามีในปัจจุบันซึ่งเป็นการเข้าถึงแพ็คเกจเริ่มต้น สิ่งนี้อาจปูทางสำหรับความต้องการprivate protectedเนื่องจากprivateมีข้อ จำกัด มากเกินไปและprotectedสุภาพเกินไป


ฉันแน่ใจว่ามันไม่คุ้มค่ามากนัก - แต่ฉันจำได้เมื่อมันเกิดขึ้น (ฉันเขียนโปรแกรมตอนเด็กและเข้าสู่สิ่งใหม่ของ Java ด้วยเหตุผลบางอย่าง) และในขณะที่ฉันไม่สามารถหาแหล่งต้นฉบับได้ - ฉันจำสิ่งต่าง ๆ ได้ อย่างนี้เมื่อฉันติดตามพวกเขา
Benjamin Gruenbaum

Early on, the Java language allowed for certain combinations of modifiers, นั่นหมายความว่ามีมากกว่า "การป้องกันส่วนตัว"
XaolingBao

@ XaolingBao แน่นอนว่าหนึ่ง accessor ไม่เหมือนผู้เข้าร่วม :) ลิงก์ที่ให้มาควรชี้แจงคำถามของคุณ
m0skit0

52

มีเรื่องราวที่สับสน / ไม่ชัดเจน:

หนึ่งจากแหล่งที่มาของพรินซ์ตันที่คุณใส่และจากที่เก็บถาวรของ MITระบุว่า:

หมายเหตุ: การเปิดตัว 1.0 ของภาษา Java รองรับการเข้าถึงห้าระดับ: สี่รายการข้างต้นพร้อมการป้องกันแบบส่วนตัว ระดับการเข้าถึงที่ป้องกันแบบส่วนตัวไม่รองรับในเวอร์ชันของ Java ที่สูงกว่า 1.0; คุณไม่ควรใช้มันในโปรแกรม Java ของคุณอีกต่อไป

แต่คุณสมบัตินี้ไม่ได้ระบุไว้ในเอกสารอย่างเป็นทางการสำหรับ Java 1.0 ที่นี่หรือที่นี่ที่นี่

ฉันเดาว่าคุณสมบัตินี้ไม่ได้ทำให้เป็นเวอร์ชั่น 1.0 อย่างเป็นทางการเนื่องจากข้อกำหนดทางภาษาอย่างเป็นทางการตั้งแต่เดือนสิงหาคม 2539 และแหล่งที่มาของพรินซ์ตันได้รับการแก้ไขครั้งล่าสุดเมื่อเดือนกุมภาพันธ์ 25391996

PS: ความอัปยศใน Oracle สำหรับการลบคลังข้อมูลสำหรับรุ่นเก่ากว่า


ลิงก์ของฉันเป็นเนื้อหาเดียวกันในเวอร์ชันที่เก่ากว่าหรือไม่ : D

บางทีข้อมูลที่หายไปอาจเกี่ยวข้องกับบันทึกย่อที่คุณใส่

@AndrewLi ไม่มีที่ใดที่ระบุว่ามีเสถียรภาพในการอ้างอิงที่ให้มา และมันก็สับสนที่จะอ้างถึง 1.0.2 เป็น 1.0 เมื่อมี 1.0 จริง
m0skit0

10

เนื่องจากลิงก์ที่คุณให้ไว้ในคำถามของคุณแนะนำให้private protectedใช้กับelement/memberคลาสเมื่อคุณต้องการให้คุณsubclassสามารถเข้าถึงองค์ประกอบได้ แต่ให้ซ่อนจากคลาสอื่นในคลาสนั้นpackageของมัน

Javaถ้าเทียบกับการC++มีแนวคิดที่พิเศษของการห่อหุ้มเซลล์แสงอาทิตย์องค์ประกอบ - และที่เป็นแพคเกจ หนึ่งควรเข้าใจในสิ่งที่สามารถเข้าถึงได้ภายในหรือภายนอกแพคเกจในJavaเมื่อมันมาถึงเหล่านี้เข้าถึง specifiers เช่นprivate, และpublicprotected

โปรดทราบว่าฉันได้อธิบายว่าทำไมมันถึงถูกใช้ ไม่ได้อยู่ในรุ่นปัจจุบันแน่นอน


ลิงก์ของฉันสำหรับการเข้าถึงวิธีการ ไม่ใช่การเข้าถึงของสมาชิก

1
@MarkYisri เดียวกันสามารถใช้สำหรับตัวแปรสมาชิกได้เช่นกัน ตัวระบุการเข้าถึงไม่ทำงานเฉพาะกับวิธีการ แต่ใช้กับสมาชิก vars ด้วย กล่าวอีกนัยหนึ่งการเข้าถึงตัวระบุเป็นแนวคิดการห่อหุ้ม & ไม่ว่าคุณจะใช้กับวิธีสมาชิกหรือตัวแปรสมาชิก ที่ใช้กับภาษาเชิงวัตถุเกือบทั้งหมดรวมถึง C ++ & java
programmer_of_the_galaxies

โอเค แต่การสอน (น่าสนใจ) ไม่ได้กล่าวถึงการป้องกันตัวแปรส่วนตัว รอและให้ฉันดูว่ามีหน้าตัวแปร ...


0

ไม่คุณไม่สามารถใช้ทั้งสองprivateอย่างprotectedพร้อมกันได้ บทช่วยสอนของคุณแปลก สิ่งที่คุณมีเรียกว่าแพ็คเกจส่วนตัวหรือในการเข้าถึงแพคเกจการป้องกันการอ้างอิง ot6 นี่คือการเข้าถึงเริ่มต้นที่เปิดใช้งานเมื่อไม่มีการระบุตัวระบุ acc6 อย่างชัดเจน


3
ฉันรู้ว่าคุณไม่สามารถใช้งานได้ ฉันต้องการรู้ว่าเกิดอะไรขึ้นกับมันซึ่งคำตอบอื่น ๆ อธิบายได้ดีกว่า

4
ลิงค์มาจากปี 1996 ดังนั้นเนื่องจากการพัฒนา Java เพิ่งเริ่มประมาณหนึ่งปีก่อนหน้านี้เนื้อหาของลิงค์ไม่แปลกจริง ๆ : D
Keiwan

6
จุดดีเกี่ยวกับวันที่ของเอกสาร ฉันตอบคำถามในขณะที่รถไฟของฉันกำลังมาถึงและเขียนโดยใช้โทรศัพท์ดังนั้นขออภัยหากคำตอบไม่ได้ตกรางพอ แค่ต้องการช่วย ...
AlexR

6
@AlexR ความผิดพลาดการสะกดของคุณตกรางเป็นจริงปุน (รถไฟ) เพิ่งสังเกตเห็น : D

1
@ Markyisri รายละเอียด การเขียนโดยใช้โทรศัพท์ไม่ใช่วิธีที่ดีที่สุดในการโพสต์คำตอบบน SO
AlexR

-2

ขอบเขตส่วนตัวกำลังอยู่ภายในคลาสที่มีอยู่ ประเด็นการป้องกันสามารถเข้าถึงได้ภายในแพคเกจและระดับการขยายโดยชั้นเรียนในแพคเกจอื่น ๆ

ต่อเนื่องหากคุณต้องการให้ตัวแปร / วิธีการเข้าถึงของคุณอยู่นอกแพ็คเกจคุณต้องกำหนดเป็นแบบป้องกัน / สาธารณะแบบส่วนตัวหรือตัวระบุการเข้าถึงอื่น ๆ

วิธีการป้องกันมักจะสามารถเข้าถึงได้จากแพคเกจภายนอกและภายในชั้นย่อยเช่นชั้นจะต้องขยายชั้นเรียนที่เกี่ยวข้องกับวิธีการที่กำหนดไว้ป้องกันประโยชน์

วิธีการ / ตัวแปรส่วนตัวมีขอบเขตภายในชั้นเรียนพวกเขาไม่สามารถเข้าถึงได้นอกชั้นเรียน

ดังนั้นคุณไม่สามารถกำหนด Private Protected ในเวลาเดียวกัน!


สิ่งนี้ไม่ได้ตอบคำถาม ฉันถามว่าทำไมมันไม่ทำงาน คำตอบอื่น ๆ ทำได้ดีกว่ามากในการตอบคำถาม

เพื่อชี้แจงเพิ่มเติมฉันรู้ว่ามันไม่ทำงานอีกต่อไป แต่คำตอบอื่น ๆ อธิบายว่าทำไมและสิ่งที่เกิดขึ้นในอดีต ของคุณไม่ได้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.