Apa perbedaan antara antarmuka dan @interface di java?

306

Saya belum menyentuh Java sejak menggunakan JBuilder di akhir 90-an saat di Universitas, jadi saya sedikit kehilangan kontak - setidaknya saya telah mengerjakan proyek Jawa kecil minggu ini, dan menggunakan Intellij IDEA sebagai IDE saya , untuk perubahan kecepatan dari perkembangan .Net biasa saya.

Saya perhatikan ada dukungan untuk menambahkan antarmuka dan @interface, apa itu @interface, dan apa bedanya dengan antarmuka normal?

public interface Test {
}

vs.

public @interface Test {
}

Saya telah melakukan sedikit pencarian, tetapi tidak dapat menemukan banyak info berguna yang merujuk ke @interface.

Bittercoder
sumber

Jawaban:

322

The @ simbol menunjukkan sebuah definisi jenis anotasi.

Itu berarti itu bukan benar-benar sebuah antarmuka, tetapi lebih merupakan jenis penjelasan baru - untuk digunakan sebagai pengubah fungsi, seperti @override .

Lihat entri javadocs ini pada subjek.

mrkishi
sumber
7
Terima kasih banyak, senang tahu. Jadi apa alasan untuk memanggilnya @interface, daripada mengatakan @annotation. Aku bertanya-tanya .. sepertinya istilah yang berlebihan tidak perlu.
Bittercoder
5
Tutorial dan JLS menyinggung anotasi sebagai jenis antarmuka khusus. Tampaknya tidak ada banyak diskusi di luar sana tentang masalah ini, tetapi javarunner.blogspot.com/2005/01/annotations-in-java-15.html menjelaskan bahwa anotasi merupakan perluasan implisit dari antarmuka Anotasi dan @ dan antarmuka digunakan untuk bersama-sama membedakan dari antarmuka biasa. Anda mungkin juga ingin membaca spesifikasi JSR untuk penjelasan.
DavidValeri
1
@Bittercoder, dokumen menyebutkan: "antarmuka kata kunci diawali dengan tanda at (@) (@ = AT, seperti pada jenis anotasi)". Itulah semua alasan yang dapat saya temukan penamaan wrt.
Shaishav
112

antarmuka:

Secara umum, sebuah antarmuka mengekspos kontrak tanpa mengekspos detail implementasi yang mendasarinya. Dalam Pemrograman Berorientasi Objek, antarmuka mendefinisikan tipe abstrak yang mengekspos perilaku, tetapi tidak mengandung logika. Implementasi didefinisikan oleh kelas atau tipe yang mengimplementasikan antarmuka.

@interface: (Jenis anotasi)

Ambil contoh di bawah ini, yang memiliki banyak komentar:

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

}

Alih-alih ini, Anda dapat mendeklarasikan jenis anotasi

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

yang kemudian dapat membubuhi keterangan kelas sebagai berikut:

@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: Banyak anotasi menggantikan komentar dalam kode.

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

mavis
sumber
11
penjelasan yang bagus
Pat B
2
Itu sebenarnya berguna. Saya tidak tahu Java bisa melakukan ini.
Jay Sidri
Jawaban sebelumnya termasuk tautan ini dari mana informasi ini berasal. Saya merasa berguna untuk menemukan informasi lebih lanjut tentang topik ini. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
Salah satu jawaban terbaik dan lengkap (belum jelas) saya telah menyaksikan di stackoverflow.
Tn. D
32

Kata interfacekunci menunjukkan bahwa Anda mendeklarasikan kelas antarmuka tradisional di Jawa.
Kata @interfacekunci digunakan untuk mendeklarasikan jenis anotasi baru.

Lihat tutorial docor. Oracle pada anotasi untuk deskripsi sintaks.
Lihat JLS jika Anda benar-benar ingin masuk ke detail apa @interfaceartinya.

DavidValeri
sumber
18

interface: mendefinisikan kontrak untuk kelas yang mengimplementasikannya

@interface: mendefinisikan kontrak untuk anotasi

Emmanuel Osimosu
sumber
8

antarmuka dalam bahasa pemrograman Java adalah tipe abstrak yang digunakan untuk menentukan perilaku yang harus diimplementasikan oleh kelas. Mereka mirip dengan protokol. Antarmuka dinyatakan menggunakan kata kunci antarmuka

@interface digunakan untuk membuat anotasi Java (kustom) Anda sendiri. Anotasi didefinisikan dalam file mereka sendiri, seperti kelas atau antarmuka Java. Berikut adalah contoh penjelasan Java khusus:

@interface MyAnnotation {

    String   value();

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

}

Contoh ini mendefinisikan anotasi yang disebut MyAnnotation yang memiliki empat elemen. Perhatikan kata kunci @interface. Ini menandakan ke kompiler Java bahwa ini adalah definisi penjelasan Java.

Perhatikan bahwa setiap elemen didefinisikan mirip dengan definisi metode di antarmuka. Ini memiliki tipe data dan nama. Anda bisa menggunakan semua tipe data primitif sebagai tipe data elemen. Anda juga dapat menggunakan array sebagai tipe data. Anda tidak dapat menggunakan objek kompleks sebagai tipe data.

Untuk menggunakan anotasi di atas, Anda dapat menggunakan kode seperti ini:

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


}

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

Piyush Singh
sumber