อะไรคือความแตกต่างระหว่างอินเตอร์เฟสและ @interface ใน java?


306

ฉันยังไม่ได้สัมผัส Java ตั้งแต่ใช้ JBuilder ในช่วงปลายยุค 90 ในขณะที่อยู่ที่มหาวิทยาลัยดังนั้นฉันจึงรู้สึกไม่ค่อยดีไม่ว่าจะด้วยวิธีใดก็ตามฉันได้ทำงานกับโปรเจ็กต์ขนาดเล็กในสัปดาห์นี้และใช้ Intellij IDEA เป็น IDE ของฉัน สำหรับการเปลี่ยนแปลงของการก้าวจากการพัฒนา. net ปกติของฉัน

ฉันสังเกตเห็นว่ามันรองรับการเพิ่มอินเตอร์เฟสและ @interfaces @interface คืออะไรและมันแตกต่างจากอินเตอร์เฟสปกติอย่างไร

public interface Test {
}

เมื่อเทียบกับ

public @interface Test {
}

ฉันได้ทำการค้นหาเล็กน้อย แต่ไม่พบข้อมูลที่เป็นประโยชน์มากมายที่อ้างถึง @interface

คำตอบ:


322

@สัญลักษณ์หมายถึงการกำหนดประเภทคำอธิบายประกอบ

นั่นหมายความว่ามันจะไม่ได้จริงๆอินเตอร์เฟซ แต่เป็นประเภทคำอธิบายประกอบใหม่ - ที่จะใช้เป็นตัวปรับแต่งฟังก์ชั่นเช่น@override

ดูรายการ javadocsนี้ในเรื่อง


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

5
บทแนะนำและ JLS หมายถึงการเพิ่มความคิดเห็นเป็นอินเทอร์เฟซชนิดพิเศษ ดูเหมือนจะไม่ได้มีการพูดคุยกันมากนักในเรื่องนี้ แต่javarunner.blogspot.com/2005/01/annotations-in-java-15.htmlอธิบายว่าคำอธิบายประกอบนั้นเป็นส่วนขยายโดยนัยของส่วนต่อประสานหมายเหตุและ @ และส่วนต่อประสาน ถูกใช้เพื่อแยกความแตกต่างจากอินเตอร์เฟสปกติ คุณอาจต้องการอ่านข้อกำหนด JSR สำหรับคำอธิบายประกอบ
DavidValeri

1
@Bittercoder เอกสารจะกล่าวถึง: "อินเทอร์เฟซคำหลักนำหน้าด้วยเครื่องหมาย at (@) (@ = AT ตามประเภทคำอธิบายประกอบ)" นั่นคือเหตุผลทั้งหมดที่ฉันสามารถหาการตั้งชื่อ wrt
Shaishav

112

อินเตอร์เฟซ:

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

@interface: (ประเภทคำอธิบายประกอบ)

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

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

แทนที่จะเป็นเช่นนี้คุณสามารถประกาศประเภทคำอธิบายประกอบได้

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

ซึ่งสามารถใส่คำอธิบายประกอบคลาสดังนี้

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

PS: คำอธิบายประกอบจำนวนมากแทนที่ความคิดเห็นในรหัส

การอ้างอิง: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html


11
คำอธิบายที่ดี
Pat B

2
นั่นเป็นประโยชน์จริง ๆ ฉันไม่รู้ว่า Java สามารถทำได้
Jay Sidri

คำตอบก่อนหน้านี้รวมลิงค์นี้ซึ่งเป็นที่มาของข้อมูลนี้ ฉันพบว่ามีประโยชน์ในการค้นหาข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS

1
หนึ่งในคำตอบที่ดีที่สุดและเต็มรูปแบบ (ยังชัดเจน) ฉันได้เห็นกับ stackoverflow
นาย D

32

interfaceคำหลักที่แสดงให้เห็นว่าคุณกำลังประกาศระดับอินเตอร์เฟซแบบดั้งเดิมใน Java คำหลักที่จะใช้ในการประกาศประเภทคำอธิบายประกอบใหม่
@interface

ดูเอกสารแนะนำการใช้งาน docs.oracleสำหรับคำอธิบายของไวยากรณ์
ดูJLSหากคุณต้องการทราบรายละเอียดของความ@interfaceหมาย


18

interface: กำหนดสัญญาสำหรับชั้นเรียนซึ่งใช้มัน

@interface: กำหนดสัญญาสำหรับคำอธิบายประกอบ


8

อินเตอร์เฟส ในภาษาการเขียนโปรแกรม Java เป็นชนิดนามธรรมที่ใช้เพื่อระบุพฤติกรรมที่ต้องใช้คลาส พวกมันคล้ายกับโปรโตคอล อินเตอร์เฟสถูกประกาศโดยใช้คีย์เวิร์ดอินเตอร์เฟส

@interface ใช้เพื่อสร้างบันทึกย่อ Java ของคุณ (กำหนดเอง) คำอธิบายประกอบถูกกำหนดไว้ในไฟล์ของตัวเองเช่นเดียวกับคลาส Java หรือส่วนต่อประสาน นี่คือตัวอย่างคำอธิบายประกอบ Java ที่กำหนดเอง:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

ตัวอย่างนี้กำหนดหมายเหตุประกอบที่เรียกว่า MyAnnotation ซึ่งมีสี่องค์ประกอบ สังเกตคำสำคัญ @interface สิ่งนี้ส่งสัญญาณไปยังคอมไพเลอร์ Java ว่านี่เป็นนิยามคำอธิบายประกอบ Java

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

ในการใช้คำอธิบายประกอบด้านบนคุณสามารถใช้รหัสดังนี้:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

การอ้างอิง - http://tutorials.jenkov.com/java/annotations.html

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