คำถามติดแท็ก default-method

15
จะใช้เมื่อใด: วิธีการเริ่มต้นของอินเตอร์เฟส Java 8+, กับวิธีที่เป็นนามธรรม
Java 8 ช่วยให้การเริ่มต้นใช้งานวิธีการในการเชื่อมต่อที่เรียกว่าวิธีการเริ่มต้น ฉันสับสนระหว่างเมื่อไรที่ฉันจะใช้ประเภทinterface default methodนั้นแทนที่จะเป็นabstract class(พร้อมabstract method(s)) ดังนั้นควรจะใช้ส่วนต่อประสานกับวิธีการเริ่มต้นเมื่อใดและควรใช้คลาสนามธรรม (พร้อมวิธีนามธรรม) เมื่อใด คลาสนามธรรมยังมีประโยชน์ในสถานการณ์นั้นหรือไม่?

5
เหตุใดจึงไม่อนุญาต“ ขั้นสุดท้าย” ในวิธีส่วนต่อประสาน Java 8
หนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของ Java 8 คือdefaultวิธีการใหม่ในส่วนต่อประสาน มีสองเหตุผลหลัก (อาจมีเหตุผลอื่น) ทำไมพวกเขาถึงได้รับการแนะนำ: ให้การใช้งานเริ่มต้นจริง ตัวอย่าง:Iterator.remove() อนุญาตให้ใช้กับวิวัฒนาการ JDK API ตัวอย่าง:Iterable.forEach() จากมุมมองของนักออกแบบ API ของผมจะชอบที่จะสามารถใช้การปรับเปลี่ยนวิธีการอื่น ๆ finalบนอินเตอร์เฟซเช่น สิ่งนี้จะเป็นประโยชน์เมื่อเพิ่มวิธีอำนวยความสะดวกป้องกันการแทนที่ "โดยไม่ตั้งใจ" ในการใช้คลาส: interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } …

4
การเรียกเมธอดดีฟอลต์อย่างชัดเจนใน Java
Java 8 แนะนำวิธีการเริ่มต้นเพื่อให้ความสามารถในการขยายส่วนต่อประสานโดยไม่จำเป็นต้องแก้ไขการใช้งานที่มีอยู่ ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเรียกใช้การเริ่มต้นของวิธีการอย่างชัดเจนเมื่อวิธีการนั้นถูกเขียนทับหรือไม่พร้อมใช้งานเนื่องจากการใช้งานเริ่มต้นที่ขัดแย้งกันในอินเตอร์เฟสที่ต่างกัน interface A { default void foo() { System.out.println("A.foo"); } } class B implements A { @Override public void foo() { System.out.println("B.foo"); } public void afoo() { // how to invoke A.foo() here? } } เมื่อพิจารณาจากโค้ดด้านบนคุณจะโทรA.foo()จากวิธีการของคลาส B ได้อย่างไร

2
อะไรคือสาเหตุที่ไม่อนุญาตให้ "ซิงโครไนซ์" ในวิธีส่วนต่อประสาน Java 8?
ใน Java 8 ฉันสามารถเขียนได้อย่างง่ายดาย: interface Interface1 { default void method1() { synchronized (this) { // Something } } static void method2() { synchronized (Interface1.class) { // Something } } } ฉันจะได้รับความหมายของการซิงโครไนซ์เต็มรูปแบบที่ฉันสามารถใช้ได้ในชั้นเรียน อย่างไรก็ตามฉันไม่สามารถใช้โมดิsynchronizedฟายเออร์ในการประกาศเมธอด: interface Interface2 { default synchronized void method1() { // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here } static synchronized …

5
Java8: เหตุใดจึงห้ามไม่ให้กำหนดวิธีการเริ่มต้นสำหรับวิธีการจาก java.lang.Object
วิธีการเริ่มต้นเป็นเครื่องมือใหม่ที่ดีในกล่องเครื่องมือ Java ของเรา อย่างไรก็ตามฉันพยายามเขียนอินเทอร์เฟซที่กำหนดdefaultเวอร์ชันของtoStringวิธีการ Java บอกฉันว่าสิ่งนี้เป็นสิ่งต้องห้ามเนื่องจากวิธีการที่ประกาศไว้java.lang.Objectอาจไม่ได้รับการdefaultแก้ไข เหตุใดจึงเป็นเช่นนี้ ฉันรู้ว่ามีกฎ "คลาสฐานเสมอชนะ" ดังนั้นโดยค่าเริ่มต้น (pun;) defaultการใช้งานObjectเมธอดใด ๆจะถูกเขียนทับโดยวิธีการObjectต่อไป อย่างไรก็ตามฉันไม่เห็นเหตุผลว่าทำไมจึงไม่ควรมีข้อยกเว้นสำหรับวิธีการจากObjectในข้อมูลจำเพาะ โดยเฉพาะอย่างยิ่งสำหรับtoStringการใช้งานเริ่มต้นอาจมีประโยชน์มาก แล้วอะไรคือสาเหตุที่นักออกแบบ Java ตัดสินใจไม่อนุญาตให้ใช้defaultวิธีการแทนที่เมธอดจากObject?

1
วิธีการเริ่มต้น Java 8 เป็นลักษณะ: ปลอดภัยหรือไม่
วิธีปฏิบัติที่ปลอดภัยในการใช้ วิธีการเริ่มต้นเป็นลักษณะเฉพาะของคนยากจนใน Java 8 หรือไม่? บางคนอ้างว่ามันอาจทำให้แพนด้าเสียใจหากคุณใช้มันเพียงเพื่อประโยชน์ของมันเพราะมันเจ๋ง แต่นั่นไม่ใช่ความตั้งใจของฉัน นอกจากนี้ยังมักจะได้รับการเตือนว่ามีการแนะนำวิธีการเริ่มต้นเพื่อสนับสนุนการพัฒนา API และความเข้ากันได้แบบย้อนหลังซึ่งเป็นความจริง แต่สิ่งนี้ไม่ได้ทำให้ผิดหรือบิดเบี้ยวในการใช้เป็นลักษณะเฉพาะ ฉันมีกรณีการใช้งานจริงดังต่อไปนี้ : public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } หรือบางทีกำหนดPeriodTrait: public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } เป็นที่ยอมรับว่าสามารถใช้องค์ประกอบ (หรือแม้แต่คลาสตัวช่วย) แต่ดูเหมือนว่าจะดูละเอียดและรกกว่าและไม่อนุญาตให้ได้รับประโยชน์จากความหลากหลาย ดังนั้นการใช้วิธีการเริ่มต้นเป็นลักษณะพื้นฐานเป็นเรื่องปกติหรือไม่ปกติหรือไม่หรือฉันควรกังวลเกี่ยวกับผลข้างเคียงที่คาดไม่ถึง? หลายคำถามเกี่ยวกับ SO เกี่ยวข้องกับลักษณะ Java และ …

4
อินเทอร์เฟซที่มีวิธีการเริ่มต้นเริ่มต้นเมื่อใด
ในขณะที่ค้นหาข้อมูลจำเพาะภาษา Java เพื่อตอบคำถามนี้ฉันได้เรียนรู้สิ่งนั้น ก่อนที่คลาสจะเริ่มต้นจะต้องเริ่มต้นคลาสซูเปอร์คลาสโดยตรงแต่อินเทอร์เฟซที่ใช้โดยคลาสจะไม่ถูกเตรียมใช้งาน ในทำนองเดียวกัน superinterfaces ของอินเทอร์เฟซจะไม่ถูกเตรียมใช้งานก่อนที่อินเทอร์เฟซจะเริ่มต้น เพื่อความอยากรู้อยากเห็นของฉันเองฉันลองใช้แล้วและตามที่คาดไว้อินเทอร์เฟซInterfaceTypeไม่ได้เริ่มต้น public class Example { public static void main(String[] args) throws Exception { InterfaceType foo = new InterfaceTypeImpl(); foo.method(); } } class InterfaceTypeImpl implements InterfaceType { @Override public void method() { System.out.println("implemented method"); } } class ClassInitializer { static { System.out.println("static initializer"); } …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.