ทำไมหนึ่งประกาศวิธีการส่วนต่อประสาน Java เป็นนามธรรม?


143

ฉันใช้คุณลักษณะการเปลี่ยนโครงสร้าง "pull interface" ของ Eclipse วันนี้เพื่อสร้างอินเตอร์เฟสตามคลาสที่มีอยู่ กล่องโต้ตอบเสนอให้สร้างวิธีการใหม่ทั้งหมดของส่วนต่อประสานใหม่เป็นวิธี "นามธรรม"

ประโยชน์ของสิ่งนั้นคืออะไร?

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

ทำไม Eclipse ถึงสนับสนุนสไตล์เช่นนี้หรือทำไมบางคนจึงเลือกที่จะทำเช่นนั้น?

ชี้แจง: ฉันไม่ได้ถามว่าทำไมวิธีการเชื่อมต่อจึงเป็นนามธรรมซึ่งเห็นได้ชัด ฉันถามว่าทำไมคนเลือกที่จะทำเครื่องหมายว่าเป็นนามธรรมอย่างชัดเจนเพราะถ้าพวกเขาอยู่ในอินเทอร์เฟซพวกเขาเป็นนามธรรมอยู่แล้ว

คำตอบ:


146

ตามที่Java Language ข้อกำหนดที่abstractคำหลักสำหรับการเชื่อมต่อเป็นล้าสมัยและไม่ควรนำมาใช้ (ส่วน 9.1.1.1)

ที่กล่าวว่าด้วยความชอบของ Java สำหรับความเข้ากันได้ย้อนหลังฉันสงสัยจริงๆว่ามันจะสร้างความแตกต่างไม่ว่าจะเป็นabstractคำหลักที่มีอยู่


1
นั่นคือความเข้าใจของฉัน (แม้ว่าฉันจะไม่คุ้นเคยกับส่วน JLS ที่เฉพาะเจาะจง) ฉันสงสัยว่าทำไมคราสจะให้ฉันเลือกของการสร้าง Obselete แต้ม ...
Uri

เข้าใจฉันแล้ว บางคนต้องของการตัดสินใจว่ามันเป็น "คุณสมบัติ" ที่พึงประสงค์และวางไว้ในคุณจะรู้ว่าหนึ่งในบรรดาเขี้ยวลากดินชนิดเปิดแหล่งที่มา :).
jdmichal

18
แม้ว่านี่จะเป็นคำตอบที่ได้รับความนิยมสูงสุด แต่ก็อ้างถึงส่วนที่ไม่ถูกต้องของข้อกำหนด 9.1.1.1 กำลังอธิบายabstractคีย์เวิร์ดในการประกาศอินเตอร์เฟสเองไม่ใช่สมาชิก @ คำตอบของ Will ด้านล่างถูกต้องและยังมีแหล่งข้อมูลลิงก์ที่ถูกต้อง
Shaggy Frog

39

"ประโยชน์ของสิ่งนั้น" (การเพิ่มบทคัดย่อเกี่ยวกับการประกาศเมธอดอินเตอร์เฟส) ใน eclipse จะเป็นปัญหาความเข้ากันได้เก่ากับคอมไพเลอร์ jdt eclipse ใน jdk1.3

ตั้งแต่ 1.4 ไลบรารี jdk จะไม่มีเมธอด abstract ดีฟอลต์อีกต่อไป (บนคลาส abstract ที่ใช้อินเตอร์เฟส)
สิ่งนี้หลอกการวินิจฉัยคอมไพเลอร์ Eclipse 1.3 เนื่องจากการนำไปปฏิบัตินั้นขึ้นอยู่กับการมีอยู่ของพวกเขา
โปรดทราบว่า Javac 1.3 จะปฏิเสธการทำงานร่วมกับ 1.4 ไลบรารี (โดยใช้ตัวเลือก -bootclasspath)

เนื่องจากคอมไพเลอร์ Eclipse มีแนวโน้มที่จะอยู่ในระดับความสอดคล้อง 1.4 (ดูWorkbench>Preferences>Java>Compiler>JDK Compliance) หรือใช้ไลบรารีคลาสอย่างน้อย 1.3 หากใช้โหมดการปฏิบัติตาม 1.3 การปรากฏตัวของ "นามธรรม" จึงไม่จำเป็นในโครงการ eclipse ส่วนใหญ่ในปัจจุบัน


3
หาดี ดังนั้นการทำงานเพื่อแก้ไขปัญหาที่ไม่มีอยู่ในคอมไพเลอร์ Eclipse
jdmichal

1
@jdmichal: แน่นอนและมันก็เป็นคำตอบที่แม่นยำกว่าสำหรับคำถามของ Uri
VonC

39

จากJava SE 7 JLS (ข้อกำหนดภาษา Java): "ได้รับอนุญาต แต่ท้อแท้เป็นเรื่องของสไตล์เพื่อระบุซ้ำตัวดัดแปลงสาธารณะและ / หรือนามธรรมสำหรับวิธีการประกาศในอินเทอร์เฟซ"

สำหรับJava SE 5.0 : "เพื่อความเข้ากันได้กับแพลตฟอร์ม Java รุ่นเก่าจะได้รับอนุญาต แต่ไม่แนะนำให้ระบุตัวดัดแปลงแบบนามธรรมสำหรับวิธีการที่ประกาศในอินเทอร์เฟซ"


9

ตามวิธีการ JLS ในส่วนต่อประสานเป็นนามธรรมโดยค่าเริ่มต้นดังนั้นคำหลักซ้ำซ้อน เมื่อรู้อย่างนี้แล้วฉันจะไม่ใช้มันเพื่อ "หลีกเลี่ยงความยุ่งเหยิงในการนำเสนอ"


นี่ควรเป็นคำตอบที่ถูกต้อง นี่คือลิงก์ที่อัปเดตแล้ว- ดูหัวข้อ "บันทึก"
mork

JLS ไม่ได้กล่าวว่าคำหลักนั้นล้าสมัยสำหรับวิธีการในส่วนต่อประสาน มันบอกว่า "ได้รับอนุญาต แต่ท้อแท้เป็นเรื่องของสไตล์เพื่อระบุตัวดัดแปลงสาธารณะและ / หรือตัวย่อที่เป็นนามธรรมสำหรับวิธีการที่ประกาศในอินเทอร์เฟซ" JLS #
มาร์ควิสแห่ง Lorne

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