Anotasi Java

114

Apa tujuan anotasi di Java? Saya memiliki gagasan kabur tentang mereka sebagai suatu tempat di antara komentar dan kode aktual. Apakah mereka mempengaruhi program pada saat dijalankan?

Apa kegunaan tipikal mereka?

Apakah mereka unik di Jawa? Apakah ada setara C ++?

Lehane
sumber
9
Anda dapat melakukan beberapa hal yang sangat jahat dengan anotasi. Misalnya, jika Anda mengetahui Spring Framework dan anotasi @Transactionalnya yang memulai transaksi sebelum pemanggilan metode dan rollback pada pengecualian / kesalahan dan melakukan transaksi yang berhasil. Ini sepenuhnya mendukung prinsip SOC (pemisahan perhatian). Sangat bersih ! Aturan Java! :-)
1
Sepertinya 3 pertanyaan bagi saya. Yang kedua itu sendiri terlalu luas.
Raedwald
Semua anotasi menurut sintaks tampak seperti antarmuka. Jadi, bagaimana compiler atau JVM mengetahui tujuannya? Misalkan jika kita mengambil @ Override -> melakukan pengecekan apakah method overriden dengan benar atau tidak @ Transactional, seperti yang dijelaskan di atas, melakukan hal-hal yang berhubungan dengan transaksi. Untuk semua anotasi ini, di mana kami dapat menemukan definisi / logika?
Paramesh Korrakuti

Jawaban:

80

Anotasi terutama digunakan oleh kode yang memeriksa kode lain. Mereka sering digunakan untuk memodifikasi (yaitu mendekorasi atau membungkus) kelas yang ada pada saat berjalan untuk mengubah perilakunya. Kerangka kerja seperti JUnit dan Hibernate menggunakan anotasi untuk meminimalkan jumlah kode yang perlu Anda tulis sendiri untuk menggunakan kerangka kerja.

Oracle memiliki penjelasan yang baik tentang konsep dan maknanya di Java di situs mereka.

Anders Sandvig
sumber
17

Juga, apakah mereka unik untuk Java, apakah ada padanan C ++?

Tidak, tapi VB dan C # memiliki atribut yang sama.

Penggunaannya cukup beragam. Satu contoh Java yang khas, @Overridetidak berpengaruh pada kode tetapi dapat digunakan oleh kompilator untuk menghasilkan peringatan (atau kesalahan) jika metode yang didekorasi tidak benar-benar menimpa metode lain. Demikian pula, metode dapat ditandai usang.

Lalu ada refleksi. Saat Anda mencerminkan jenis kelas dalam kode Anda, Anda dapat mengakses atribut dan bertindak sesuai dengan informasi yang ditemukan di sana. Saya tidak tahu contoh apa pun di Java tetapi di .NET ini digunakan oleh kompiler untuk menghasilkan (de) informasi serialisasi untuk kelas, menentukan tata letak memori struktur dan mendeklarasikan impor fungsi dari pustaka warisan (antara lain). Mereka juga mengontrol cara kerja desainer formulir IDE.

/ EDIT: Atribut pada kelas sebanding dengan antarmuka tag (seperti Serializable di Java). Namun, pedoman pengkodean .NET mengatakan untuk tidak menggunakan antarmuka tag. Juga, mereka hanya bekerja pada level kelas, bukan pada level metode.

Konrad Rudolph
sumber
13

Anders memberikan ringkasan yang bagus, dan berikut adalah contoh anotasi JUnit

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

Di sini @Testanotasi memberi tahu JUnit bahwa flatfileMissingmetode tersebut adalah pengujian yang harus dijalankan dan bahwa hasil yang diharapkan adalah dilempar IOException. Jadi, saat Anda menjalankan pengujian, metode ini akan dipanggil dan pengujian akan lulus atau gagal berdasarkan apakah sebuah IOExceptiondilempar.

Eli Courtwright
sumber
7

Java juga memiliki Alat Pemrosesan Anotasi (apt) di mana Anda tidak hanya membuat anotasi, tetapi juga memutuskan bagaimana anotasi ini bekerja pada kode sumber.

Berikut adalah pengantar.

pek
sumber
4

Untuk melihat beberapa hal keren yang dapat Anda lakukan dengan Anotasi, lihat pemroses anotasi dan anotasi JavaBean saya .

Mereka bagus untuk menghasilkan kode, menambahkan validasi ekstra selama pembuatan Anda, dan saya juga telah menggunakannya untuk kerangka pesan kesalahan (belum diterbitkan - perlu jelas dengan bos ...).

Scott Stanchfield
sumber
1

Menurut definisi literal, anotasi menambahkan catatan ke elemen. Demikian pula, anotasi Java adalah tag yang kami masukkan ke dalam kode sumber untuk memberikan informasi lebih lanjut tentang kode tersebut. Anotasi Java mengaitkan informasi dengan elemen program beranotasi. Selain penjelasan Java, program Java memiliki banyak sekali dokumentasi informal yang biasanya terkandung di dalam komentar di file kode sumber. Namun, penjelasan Java berbeda dengan komentar, penjelasannya menganotasi elemen program secara langsung menggunakan jenis anotasi untuk mendeskripsikan bentuk anotasi. Anotasi Java menyajikan informasi dengan cara standar dan terstruktur sehingga dapat digunakan dengan baik oleh alat pemrosesan.

Untuk membaca secara detail, ada tutorial bagus tentang Anotasi Java

Krishan
sumber
0

Anotasi dalam hal EJB dikenal sebagai memilih pendekatan perangkat menengah implisit daripada pendekatan perangkat menengah eksplisit, saat Anda menggunakan anotasi, Anda menyesuaikan apa yang sebenarnya Anda butuhkan dari API, misalnya Anda perlu memanggil metode transaksi untuk transfer bank : tanpa menggunakan anotasi: kode akan menjadi

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

ketika menggunakan Annotation, kode Anda tidak berisi panggilan API yang rumit untuk menggunakan layanan perantara. Kode tersebut bersih dan berfokus pada logika bisnis

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
Mesin penuai
sumber