Pada tahun 2005, dengan ketibaan Java 5, kami mula mengenali entiti baharu yang dipanggil anotasi.

Anotasi ialah bentuk khas metadata sintaksis yang boleh diisytiharkan dalam kod. Ia digunakan untuk menganalisis kod semasa penyusunan atau semasa runtime. Anda boleh menganggap anotasi sebagai label, teg atau petunjuk pengkompil.

Anda mungkin pernah menjumpai anotasi sebelum ini. Sebagai contoh, apabila mengatasi kaedah kelas induk, kami menulis @Override sebelum kaedah itu sendiri. Anotasi ini menunjukkan bahawa kaedah ibu bapa akan ditindih dalam kelas anak.

Sintaks:

@Override
public int hashCode() {
      return super.hashCode();
}

Saya ingin ambil perhatian segera bahawa anotasi bukan sahaja digunakan pada kaedah. Ia digunakan dengan pakej, kelas, kaedah, medan dan parameter.

Untuk memahami cara anotasi berfungsi, mari kita mula-mula berkenalan dengan konsep antara muka penanda. Sejak kemunculan Java, pembangun sentiasa memerlukan cara untuk menandakan kelas untuk melakukan tindakan tertentu pada mereka.

Sebelum Java 5, mereka menggunakan antara muka yang tidak melakukan apa yang kami harapkan antara muka lakukan. Ia tidak mempunyai kaedah dan kontrak. Ia hanya menandakan kelas sebagai istimewa dalam beberapa cara.

Antara muka sedemikian dipanggil antara muka penanda. Daripada nama anda mungkin meneka bahawa tujuannya adalah untuk menandakan kelas untuk JVM, pengkompil atau beberapa perpustakaan. Beberapa antara muka penanda, seperti Serializable , kekal. Antara muka penanda ini membolehkan kami menunjukkan bahawa kejadian kelas boleh bersiri.

Seperti yang telah kita lihat, antara muka penanda terus hidup walaupun selepas pengenalan anotasi.

Anotasi berbanding antara muka penanda:

@MyAnnotation
public class MyClass {}
public class MyClass implements MarkerInterface {}

Kedua-dua pendekatan mempunyai objektif yang sama, tetapi terdapat perbezaan yang jelas dalam pelaksanaannya. Sebagai contoh, pertimbangkan antara muka dan anotasi yang menunjukkan bahawa kelas tergolong dalam jenis tertentu.

Jika kami menggunakan antara muka, maka kami menandakan kelas. Jika kami menggunakannya secara tidak betul dan ralat berlaku, maka kami akan menemui masalah semasa penyusunan dan program tidak akan berjalan.

Dengan anotasi, semuanya tidak begitu mudah: di sini ralat akan dikesan semasa runtime, yang bermaksud bahawa program akan bermula, tetapi, tidak mengejutkan, ia tidak akan selesai.

Ambil perhatian bahawa jika kita perlu menandakan kelas untuk kegunaan masa hadapan, kejadiannya mesti dihantar kepada kaedah tertentu:

public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}

public static void increase(Sum count) {
        // TODO
}

Antara muka penanda berfungsi paling baik di sini.

Lebih baik menggunakan anotasi apabila kita memerlukan sesuatu yang lebih, seperti parameter yang disokong oleh anotasi.

Mari lihat anotasi standard dalam JDK:

Anotasi Penerangan Contoh
@Override Menentukan bahawa kaedah mengatasi kaedah superclass atau melaksanakan kaedah kelas abstrak atau antara muka.
@Override
public int hashCode() {
        return super.hashCode();
}
@Ditamatkan Tandakan kod sebagai ditamatkan.
@Deprecated
public abstract void method();
@SuppressWarnings Melumpuhkan amaran pengkompil untuk elemen beranotasi. Ambil perhatian bahawa jika anda perlu melumpuhkan berbilang kategori amaran, ia mesti disertakan dalam pendakap kerinting, contohnya @SuppressWarnings({"unchecked", "cast"}) .
public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

Dalam contoh ini, kami cuba menambah pada senarai yang tidak mempunyai jenis yang ditentukan (jenis generik). Penyusun akan memberi amaran kepada kita tentang perkara ini. Ini sangat berguna, tetapi kadangkala terdapat terlalu banyak "amaran" dan ia boleh menjadi bising. Anda boleh menggunakan anotasi kaedah ini dan menentukan jenis amaran pengkompil sebagai hujah. Terdapat banyak penanda, jadi jangan risau tentang mengingati semuanya — IDEA biasanya akan memberitahu anda yang mana satu untuk ditambah.

Contoh lain dengan pelbagai hujah:

@SuppressWarnings({"unchecked", "deprecated"})