Яка різниця між інтерфейсом та @interface у Java?


306

Я не торкався Java, оскільки використовував JBuilder наприкінці 90-х, будучи в університеті, тому я трохи не зв’язаний - у будь-якому випадку я працював над невеликим проектом Java на цьому тижні і використовую Intellij IDEA як мій IDE , для зміни темпу від мого регулярного розвитку .Net.

Я зауважую, що у нього є підтримка додавання інтерфейсів та @interface, що таке @interface, і чим він відрізняється від звичайного інтерфейсу?

public interface Test {
}

vs.

public @interface Test {
}

Я трохи пошукав, але не зміг знайти багато корисної інформації, що стосується @interface.

Відповіді:


322

Символ @ позначає визначення типу анотацій.

Це означає , що це НЕ на насправді інтерфейс, а новий тип анотації - для використання в якості модифікатора функції, такі як @Override .

Дивіться цей запис у цьому документі на javadocs .


7
Велике спасибі, добре знати. Тож, що було обґрунтуванням його називати @interface, а тоді скажіть @annotation Цікаво .. здається, що це зайвий перевантажений термін.
Bittercoder

5
Підручник та JLS натякають на примітку, що є особливим інтерфейсом. Здається, на цю тему не так багато дискусій, але javarunner.blogspot.com/2005/01/annotations-in-java-15.html пояснює, що анотації - це неявне розширення інтерфейсу анотацій та @ та інтерфейсу використовуються, щоб разом відрізнятись від звичайного інтерфейсу. Ви також можете прочитати специфікацію JSR для анотацій.
DavidValeri

1
@Bittercoder документи згадують: "Інтерфейс ключових слів передує знаку at (@) (@ = AT, як у типі анотацій)". Це все обгрунтування, яке я можу знайти Wrt іменування.
Шайшав

111

інтерфейс:

Взагалі інтерфейс виставляє контракт, не розкриваючи основні деталі реалізації. В об'єктно-орієнтованому програмуванні інтерфейси визначають абстрактні типи, які викривають поведінку, але не містять логіки. Реалізація визначається класом або типом, який реалізує інтерфейс.

@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
приємне пояснення
Пат Б

2
Це було насправді корисно. Я не знав, що Java може це зробити.
Джей Сидрі

Попередня відповідь включала це посилання, звідки походить ця інформація. Мені було корисно знайти більше інформації з цієї теми. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS

1
Один з найкращих і повних відповідей (поки ясний), я був свідком стакверху.
Містер Д

32

interfaceКлючове слово вказує на те, що ви оголошуєте традиційний клас інтерфейсу в Java. Ключове слово використовується для оголошення нового типу анотацій.
@interface

Дивіться підручник з docs.oracle щодо приміток для опису синтаксису.
Подивіться JLS, якщо ви дійсно хочете розібратися в подробицях того, що @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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.