Jaka jest różnica między interfejsem a interfejsem @ w Javie?

306

Nie dotknąłem Javy od czasu używania JBuilder pod koniec lat 90. na uniwersytecie, więc jestem trochę poza kontaktem - w każdym razie pracowałem nad małym projektem Java w tym tygodniu i używałem Intellij IDEA jako mojego IDE , dla zmiany tempa od mojego regularnego rozwoju .Net.

Zauważyłem, że obsługuje dodawanie interfejsów i interfejsów @, co to jest interfejs @ i czym różni się od zwykłego interfejsu?

public interface Test {
}

vs.

public @interface Test {
}

Przeprowadziłem trochę wyszukiwania, ale nie znalazłem wielu użytecznych informacji dotyczących @interface.

Bittercoder
źródło

Odpowiedzi:

322

@ Symbol oznacza definicji typu opisów.

Oznacza to, że tak naprawdę nie jest to interfejs, ale nowy typ adnotacji - do użycia jako modyfikator funkcji, taki jak @override .

Zobacz ten wpis javadocs na ten temat.

mrkishi
źródło
7
Wielkie dzięki, dobrze wiedzieć. Jaki był więc powód nazywania go @interface, a nie powiedz @ adnotacja Zastanawiam się .. wydaje się niepotrzebnie przeciążonym terminem.
Bittercoder
5
Samouczek i JLS nawiązują do adnotacji będącej specjalnym rodzajem interfejsu. Wydaje się, że nie ma dużo dyskusji na ten temat, ale javarunner.blogspot.com/2005/01/annotations-in-java-15.html wyjaśnia, że ​​adnotacje są domyślnym rozszerzeniem interfejsu adnotacji i interfejsu @ i służą do odróżnienia od zwykłego interfejsu. Możesz także przeczytać specyfikację JSR dla adnotacji.
DavidValeri
1
@Bittercoder, o którym wspominają dokumenty: „interfejs słowa kluczowego poprzedza znak at (@) (@ = AT, jak w typie adnotacji)”. To wszystko uzasadnienie, które mogę znaleźć nazywanie.
Shaishav,
111

berło:

Zasadniczo interfejs ujawnia umowę bez ujawniania podstawowych szczegółów implementacji. W programowaniu obiektowym interfejsy definiują abstrakcyjne typy, które ujawniają zachowanie, ale nie zawierają logiki. Implementacja jest zdefiniowana przez klasę lub typ, który implementuje interfejs.

@interface: (typ adnotacji)

Weź poniższy przykład, który ma wiele komentarzy:

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

}

Zamiast tego możesz zadeklarować typ adnotacji

 @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();
}

który może następnie opisać klasę w następujący sposób:

@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: Wiele adnotacji zastępuje komentarze w kodzie.

Odniesienie: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html

Mavis
źródło
11
ładne wyjaśnienie
Pat B
2
To było naprawdę przydatne. Nie wiedziałem, że Java może to zrobić.
Jay Sidri,
Poprzednia odpowiedź zawierała ten link, z którego pochodzi ta informacja. Przydało mi się znaleźć więcej informacji na ten temat. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
Jedna z najlepszych i pełnych odpowiedzi (jeszcze jasnych), których byłem świadkiem w przypadku przepełnienia stosu.
Pan D
32

Słowo interfacekluczowe wskazuje, że deklarujesz tradycyjną klasę interfejsu w Javie.
Słowo @interfacekluczowe służy do deklarowania nowego typu adnotacji.

Aby zapoznać się z opisem składni, zobacz samouczek docs.oracle na temat adnotacji.
Zobacz JLS, jeśli naprawdę chcesz dowiedzieć się, co @interfaceto znaczy.

DavidValeri
źródło
18

interface: definiuje kontrakt dla klasy, która go implementuje

@interface: określa umowę na adnotację

Emmanuel Osimosu
źródło
8

Interfejs w języku programowania Java jest abstrakcyjnym typem używanym do określania zachowania, które muszą zostać zaimplementowane przez klasy. Są podobne do protokołów. Interfejsy deklarowane są za pomocą słowa kluczowego interface

Interfejs @ służy do tworzenia własnych (niestandardowych) adnotacji Java. Adnotacje są zdefiniowane we własnym pliku, podobnie jak klasa Java lub interfejs. Oto niestandardowy przykład adnotacji Java:

@interface MyAnnotation {

    String   value();

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

}

W tym przykładzie zdefiniowano adnotację o nazwie MyAnnotation, która zawiera cztery elementy. Zwróć uwagę na słowo kluczowe @interface. Sygnalizuje to kompilatorowi Java, że ​​jest to definicja adnotacji Java.

Zauważ, że każdy element jest zdefiniowany podobnie do definicji metody w interfejsie. Ma typ danych i nazwę. Możesz używać wszystkich pierwotnych typów danych jako typów danych elementów. Możesz także użyć tablic jako typu danych. Nie można używać złożonych obiektów jako typu danych.

Aby użyć powyższej adnotacji, możesz użyć następującego kodu:

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


}

Odniesienie - http://tutorials.jenkov.com/java/annotations.html

Piyush Singh
źródło