ตอนนี้ไม่ใช่ว่าการประกาศเมธอดทั้งหมดใน Java Interface นั้นเป็นนามธรรมสาธารณะควรจะประกาศเมธอดด้วยตัวดัดแปลงเหล่านี้หรือไม่?


14

เริ่มต้นด้วย Java 8 defaultมีการนำวิธีการมาใช้ในอินเตอร์เฟส ได้อย่างมีประสิทธิภาพที่นี้หมายถึงว่าไม่ทุกวิธีการในการให้มีinterfaceabstract

เริ่มต้นด้วย Java 9 (อาจ) privateวิธีการจะได้รับอนุญาต ซึ่งหมายความว่าไม่ทุกวิธีการในการให้มีinterfacepublic abstract

คำถาม "ควรประกาศวิธีการในส่วนต่อประสาน Java โดยมีหรือไม่มีpublicตัวแก้ไขการเข้าถึงหรือไม่" ถูกถามที่ Stack Overflow ที่/programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m

คำตอบส่วนใหญ่แย้งว่าpublic abstractไม่ควรใช้เพราะไม่มีวิธีการใดที่interfaceสามารถเป็นอย่างอื่นpublic abstractได้ นี่ไม่ใช่กรณีอีกต่อไป

ดังนั้นด้วยคุณสมบัติใหม่ของอินเทอร์เฟซเหล่านี้ควรใช้public abstractคีย์เวิร์ดในการประกาศเมธอดของอินเตอร์เฟส Java หรือไม่?

ในสภาพแวดล้อมเฉพาะของฉันเราจะมีคนที่มีประสบการณ์วิศวกรซอฟต์แวร์ แต่ไม่เคยมีประสบการณ์ใน Java อ่านโค้ด Java เป็นครั้งคราว ฉันรู้สึกว่าการละทิ้งpublic abstractคำหลักจะสร้างจุดสับสนเพิ่มเติมสำหรับผู้ที่ไม่คุ้นเคยกับประวัติว่าอินเตอร์เฟสมีกฎแตกต่างกันสำหรับการใช้คำหลักเหล่านี้อย่างไร


5
คุณตรวจสอบ Java 8 JLS หรือไม่ ส่วนเดียวกับคำตอบเก่าที่ยอมรับดังนั้นการนำเสนอวิธีการเริ่มต้นไม่ได้เปลี่ยนคำแนะนำก่อนหน้าซึ่งมีพื้นฐานมาจากข้อควรพิจารณาที่ซ้ำซ้อน: "วิธีการเชื่อมต่อที่ขาดdefaultตัวดัดแปลงหรือstaticตัวดัดแปลงนั้นโดยปริยายabstract... มันได้รับอนุญาต แต่ ท้อแท้เป็นเรื่องของสไตล์เพื่อระบุการเปลี่ยนแปลงซ้ำซ้อนabstractสำหรับการประกาศวิธีการดังกล่าว " ทำไมคุณคาดหวังว่าสิ่งต่าง ๆ ควรเปลี่ยนแปลง?
ริ้น

3
ฉันคิดว่าสิ่งต่าง ๆ อาจเปลี่ยนแปลงได้เนื่องจากเงื่อนไขสำหรับวิธีการที่จะabstractเพิ่มความซับซ้อนโดยปริยาย ใน Java 9 ประโยคเดียวกันว่าอาจจะมี "วิธีการอินเตอร์เฟซที่ขาดdefaultปรับปรุงหรือstaticปรับแต่งหรือprivateปรับแต่งเป็นนามธรรมโดยปริยาย ..." นอกจากนี้ข้อโต้แย้งเสริมไม่ชัดเจนใช้คำหลักคือว่าวิธีการอินเตอร์เฟซที่ทุกคนมีpublic abstract, ตอนนี้กำลังสงสัย
เดวิดแคมป์เบล

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

1
@TrixieWolf วิธีการเริ่มต้นช่วยให้การเชื่อมต่อการพัฒนา ก่อนหน้านี้และไม่เหมือนกับคลาสการเพิ่มเมธอดจะทำลายการใช้งานทุกครั้ง ตอนนี้คุณสามารถเพิ่มส่วนต่อประสานได้ตราบใดที่คุณมีค่าเริ่มต้นที่เหมาะสม พิจารณานอกเหนือจาก streamไปหรือjava.util.Collection Map.getOrDefault()ทางเลือกคือการสร้างอินเทอร์เฟซย่อยใหม่และทำให้ทุกคนตกต่ำเช่น Graphics2D และไม่มีใครสนุกเลย!
SusanW

คำตอบ:


2

หากต้องการขยายคำตอบของ StackOverflow:

  1. publicปรับปรุงการเข้าถึงไม่จำเป็นเพราะ

    ทุกวิธีการประกาศในเนื้อหาของอินเทอร์เฟซสาธารณะโดยปริยาย (§6.6) มันได้รับอนุญาต แต่ท้อแท้เป็นเรื่องของสไตล์เพื่อระบุตัวดัดแปลงสาธารณะซ้ำซ้อนสำหรับการประกาศวิธีการในอินเตอร์เฟซ ( มาตรา 9.4 )

  2. abstractปรับปรุงการเข้าถึงไม่จำเป็นเพราะ

    เมธอดดีฟอลต์คือเมธอดที่ถูกประกาศในอินเตอร์เฟสที่มีตัวดัดแปลงดีฟอลต์ ร่างกายของมันจะถูกบล็อกเสมอ

    และ...

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

เนื่องจากวิธีการเริ่มต้นนั้นมีเนื้อความและสิ่งที่ไม่เป็นนามธรรมโดยเนื้อแท้และการประกาศทุกวิธีบนอินเทอร์เฟซเป็นแบบเปิดเผยโดยทั่วไปคุณไม่จำเป็นต้องระบุคำหลัก


หนึ่งในความคิดเห็นเกี่ยวกับคำตอบกล่าวว่า:

อย่าทำให้พวกเขาคิด! ฉันมักจะเพิ่มบทคัดย่อสาธารณะก่อนหน้านี้แม้จะเป็นตำรวจสไตล์ก็ตามเพราะมันทำให้สิ่งต่าง ๆ ชัดเจนและเตือนผู้อ่าน ตอนนี้ฉันพิสูจน์เพราะ Java 8 และ 9 ซับซ้อน (user949300)

ความคิดเห็นเกี่ยวกับคำถาม StackOverflow (โหวตสูงสุด 18 ครั้ง) จะปฏิเสธสิ่งนี้:

มันไม่ดีเพราะการเขียนเป็นสาธารณะหมายถึงว่ามันอาจไม่ใช่แบบสาธารณะ (Pacerier)

ความหมายของรหัสโดยเฉพาะส่วนต่อประสานมีความสำคัญ


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

@DavidCampbell: ดีฉันคิดว่าคำถามนี้อาจจะถามดีกว่าหลังจาก Java 9 ออกมา :) ข้อมูลจำเพาะ Java ที่ยังไม่ทราบแน่ชัดอาจตอบคำถามนี้ได้
Greg Burghardt

1

การขาดคำสั่งบล็อกไม่เพียงพอหรือไม่ คุณจะประกาศextends Objectแม้ว่ามันจะส่อให้เห็น?

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

ผู้พัฒนาต้องเข้าใจว่าจุดประสงค์ของอินเทอร์เฟซคือการสร้างสัญญาที่กำหนดว่าลูกค้าสามารถโต้ตอบกับวัตถุได้อย่างไร นี้แสดงให้เห็นวิธีการใด ๆ ในอินเตอร์เฟซที่ใช้สำหรับการปฏิสัมพันธ์วัตถุควรสัมผัสกับลูกค้า

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


2
อย่าทำให้พวกเขาคิด! ฉันมักจะเพิ่มมาpublic abstractก่อนแม้จะเป็นตำรวจสไตล์ทำให้มันชัดเจนและเตือนผู้อ่าน ตอนนี้ฉันพิสูจน์เพราะ Java 8 และ 9 ซับซ้อน :-) Java นั้นซ้ำซ้อนมากมายอยู่แล้ว
user949300

1
@ user949300 คุณจะเพิ่มextends Objectทุกคลาสที่มาจากโดยตรงObjectหรือไม่? เป็นข้อมูลที่นักพัฒนาซอฟต์แวร์ควรทราบแล้วซึ่งเป็นสาเหตุที่ทำให้อนุมานได้ ข้อมูลที่ไร้ประโยชน์น้อยลงบนหน้าจอยิ่งง่ายต่อการประมวลผลข้อมูลสำคัญ หวังว่าฉันจะชักชวนให้คุณมาที่ด้านมืด (เข้าใจไหมเพราะไม่เห็นสิ่งที่บอกเป็นนัย) ถ้าไม่มันก็คุ้มค่ากับการยิงฮ่าฮ่า ในที่สุดมันก็ลงมาที่สิ่งที่ทำให้การจัดการโค้ดง่ายขึ้นสำหรับนักพัฒนา
Vince Emigh

@ user949300 โดยการทำเช่นนี้คุณมีแนวโน้มที่จะสร้างความสับสนเกี่ยวกับความหมายของมันเมื่อเมธอดอินเตอร์เฟสไม่มีการประกาศเหล่านี้ เช่นหากมีนักพัฒนาเรียนรู้ java โดยดูที่รหัสของคุณคุณอาจ hobbled ความเข้าใจในไวยากรณ์ของการประกาศอินเตอร์เฟส
JimmyJames

วินซ์ไม่ฉันจะไม่ขยายวัตถุแม้ว่าฉันจะไม่เหมาะสมเมื่อฉันเห็นโค้ดที่ทำเช่นนั้น @JimmyJames หากมีความสอดคล้องเพิ่มนามธรรมสาธารณะให้กับรายการที่เป็นเช่นนั้นฉันไม่เห็นความสับสนใด ๆ ฉันพลาดอะไรไปรึเปล่า? OTOH ฉันเห็นจุดของคุณรกรุงรัง ตัวอย่างเช่นฉันไม่ได้เพิ่มfinalก่อนอาร์กิวเมนต์วิธียกเว้นว่าสิ่งที่ตลกต้องการ (เช่นคลาสภายในที่ไม่ระบุชื่อ ฯลฯ ... )
user949300

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