java
Dalam tutorial ini, kita akan belajar tentang berbagai jenis anotasi Java dengan bantuan contoh.
Anotasi Java adalah metadata (data tentang data) untuk kode sumber program kami. Ada beberapa anotasi standar yang disediakan oleh Java SE. Selain itu, kami juga dapat membuat anotasi khusus sesuai kebutuhan kami.
Jika Anda tidak tahu apa itu anotasi, kunjungi tutorial anotasi Java.
Anotasi ini dapat dikategorikan sebagai:
1. Anotasi standar
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
2. Anotasi khusus
3. Anotasi meta
@Retention
@Documented
@Target
@Inherited
@Repeatable
@Deprecated
anotasi adalah anotasi penanda yang menunjukkan bahwa elemen (kelas, metode, bidang, dll) tidak digunakan lagi dan telah digantikan oleh elemen yang lebih baru.
Sintaksnya adalah:
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
Ketika sebuah program menggunakan elemen yang telah dinyatakan tidak digunakan lagi, kompilator akan mengeluarkan peringatan.
Kami menggunakan Javadoc @deprecated
tag untuk mendokumentasikan elemen yang tidak digunakan lagi.
/**
* @deprecated
* why it was deprecated
*/
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
class Main {
/**
* @deprecated
* This method is deprecated and has been replaced by newMethod()
*/
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
public static void main(String args[]) {
deprecatedMethod();
}
}
Keluaran
Deprecated method
@Override
anotasi menetapkan bahwa metode subkelas menimpa metode superkelas dengan nama metode, tipe kembalian, dan daftar parameter yang sama.
Tidak wajib menggunakan @Override
saat mengganti metode. Namun, jika kita menggunakannya, kompilator memberikan kesalahan jika ada yang salah (seperti tipe parameter yang salah) saat mengganti metode.
class Animal {
// overridden method
public void display(){
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println("I am a dog");
}
public void printMessage(){
display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
Keluaran
I am a dog
Dalam contoh ini, dengan membuat objek dog1 dari Anjing kelas, kita dapat memanggil metodenya printMessage() yang kemudian mengeksekusi display()
pernyataan.
Sejak display()
didefinisikan di kedua kelas, metode subkelas Anjing menimpa metode superclass Hewan . Oleh karena itu, display()
dari subkelas disebut.
Seperti namanya, @SuppressWarnings
anotasi menginstruksikan kompiler untuk menekan peringatan yang dihasilkan saat program dijalankan.
Kita dapat menentukan jenis peringatan yang akan ditekan. Peringatan yang dapat ditekan adalah khusus kompiler tetapi ada dua kategori peringatan:penghentian dan tidak dicentang .
Untuk menekan kategori peringatan tertentu, kami menggunakan:
@SuppressWarnings("warningCategory")
Misalnya,
@SuppressWarnings("deprecated")
Untuk menekan beberapa kategori peringatan, kami menggunakan:
@SuppressWarnings({"warningCategory1", "warningCategory2"})
Misalnya,
@SuppressWarnings({"deprecated", "unchecked"})
Kategori deprecated
menginstruksikan kompiler untuk menekan peringatan saat kita menggunakan elemen yang tidak digunakan lagi.
Kategori unchecked
menginstruksikan kompiler untuk menekan peringatan saat kita menggunakan tipe mentah.
Dan, peringatan yang tidak ditentukan diabaikan. Misalnya,
@SuppressWarnings("someundefinedwarning")
class Main {
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
@SuppressWarnings("deprecated")
public static void main(String args[]) {
Main depObj = new Main();
depObj. deprecatedMethod();
}
}
Keluaran
Deprecated method
Di sini, deprecatedMethod()
telah ditandai sebagai usang dan akan memberikan peringatan kompiler saat digunakan. Dengan menggunakan @SuppressWarnings("deprecated")
anotasi, kita dapat menghindari peringatan compiler.
@SafeVarargs
anotasi menegaskan bahwa metode atau konstruktor beranotasi tidak melakukan operasi yang tidak aman pada varargsnya (jumlah argumen yang bervariasi).
Kami hanya dapat menggunakan anotasi ini pada metode atau konstruktor yang tidak dapat diganti. Ini karena metode yang menggantikannya mungkin melakukan operasi yang tidak aman.
Sebelum Java 9, kita dapat menggunakan anotasi ini hanya pada metode final atau statis karena tidak dapat diganti. Kami sekarang dapat menggunakan anotasi ini untuk metode pribadi juga.
import java.util.*;
class Main {
private void displayList(List<String>... lists) {
for (List<String> list : lists) {
System.out.println(list);
}
}
public static void main(String args[]) {
Main obj = new Main();
List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University");
obj.displayList(universityList);
List<String> programmingLanguages = Arrays.asList("Java", "C");
obj.displayList(universityList, programmingLanguages);
}
}
Peringatan
Type safety: Potential heap pollution via varargs parameter lists Type safety: A generic array of List<String> is created for a varargs parameter
Keluaran
Note: Main.java uses unchecked or unsafe operations. [Tribhuvan University, Kathmandu University] [Tribhuvan University, Kathmandu University] [Java, C]
Di sini, List
... lists
menentukan argumen panjang variabel dengan tipe List
. Ini berarti bahwa metode displayList()
dapat memiliki nol atau lebih argumen.
Program di atas dikompilasi tanpa kesalahan tetapi memberikan peringatan ketika @SafeVarargs
anotasi tidak digunakan.
Saat kita menggunakan @SafeVarargs
anotasi pada contoh di atas,
@SafeVarargs private void displayList(List<String>... lists) { ... }
Kami mendapatkan output yang sama tetapi tanpa peringatan apa pun. Peringatan yang tidak dicentang juga disembunyikan saat kami menggunakan anotasi ini.
Java 8 pertama kali memperkenalkan @FunctionalInterface
. ini anotasi. Anotasi ini menunjukkan bahwa deklarasi tipe yang digunakan adalah antarmuka fungsional. Antarmuka fungsional hanya dapat memiliki satu metode abstrak.
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
}
Jika kita menambahkan metode abstrak lain, misalkan
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
public void secondMethod(); // this throws compile error
}
Sekarang, ketika kita menjalankan program, kita akan mendapatkan peringatan berikut:
Unexpected @FunctionalInterface annotation @FunctionalInterface ^ MyFuncInterface is not a functional interface multiple non-overriding abstract methods found in interface MyFuncInterface
Tidak wajib menggunakan @FunctionalInterface
anotasi. Kompilator akan mempertimbangkan antarmuka apa pun yang memenuhi definisi antarmuka fungsional sebagai antarmuka fungsional.
Kami menggunakan anotasi ini untuk memastikan bahwa antarmuka fungsional hanya memiliki satu metode abstrak.
Namun, ia dapat memiliki sejumlah metode default dan statis karena memiliki implementasi.
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
default void secondMethod() { ... }
default void thirdMethod() { ... }
}
Dimungkinkan juga untuk membuat anotasi khusus kita sendiri.
Sintaksnya adalah:
[Access Specifier] @interface<AnnotationName> { DataType <Method Name>() [default value]; }
Inilah yang perlu Anda ketahui tentang anotasi khusus:
@interface
diikuti dengan nama anotasi.
@interface MyCustomAnnotation {
String value() default "default value";
}
class Main {
@MyCustomAnnotation(value = "programiz")
public void method1() {
System.out.println("Test method 1");
}
public static void main(String[] args) throws Exception {
Main obj = new Main();
obj.method1();
}
}
Keluaran
Test method 1
Meta-anotasi adalah anotasi yang diterapkan ke anotasi lain.
@Retention
anotasi menentukan tingkat ketersediaan anotasi.
Sintaksnya adalah:
@Retention(RetentionPolicy)
Ada 3 jenis kebijakan retensi:
Misalnya,
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{ ... }
Secara default, anotasi khusus tidak disertakan dalam dokumentasi Java resmi. Untuk menyertakan anotasi kami dalam dokumentasi Javadoc, kami menggunakan @Documented
anotasi.
Misalnya,
@Documented
public @interface MyCustomAnnotation{ ... }
Kami dapat membatasi anotasi untuk diterapkan ke target tertentu menggunakan @Target
anotasi.
Sintaksnya adalah:
@Target(ElementType)
ElementType
dapat memiliki salah satu jenis berikut:
Jenis Elemen | Target |
---|---|
ElementType.ANNOTATION_TYPE | Jenis anotasi |
ElementType.CONSTRUCTOR | Konstruktor |
ElementType.FIELD | Bidang |
ElementType.LOCAL_VARIABLE | Variabel lokal |
ElementType.METHOD | Metode |
ElementType.PACKAGE | Paket |
ElementType.PARAMETER | Parameter |
ElementType.TYPE | Elemen kelas apa saja |
Misalnya,
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation{ ... }
Dalam contoh ini, kami telah membatasi penggunaan anotasi ini hanya untuk metode.
Catatan: Jika jenis target tidak ditentukan, anotasi dapat digunakan untuk elemen apa pun.
Secara default, tipe anotasi tidak dapat diwarisi dari superclass. Namun, jika kita perlu mewarisi anotasi dari superclass ke subclass, kita menggunakan @Inherited
anotasi.
Sintaksnya adalah:
@Inherited
Misalnya,
@Inherited
public @interface MyCustomAnnotation { ... }
@MyCustomAnnotation
public class ParentClass{ ... }
public class ChildClass extends ParentClass { ... }
Anotasi yang telah ditandai dengan @Repeatable
dapat diterapkan beberapa kali ke deklarasi yang sama.
@Repeatable(Universities.class)
public @interface University {
String name();
}
Nilai yang ditentukan dalam @Repeatable
anotasi adalah anotasi wadah. Anotasi penampung memiliki variabel nilai jenis array dari anotasi berulang di atas. Di sini, Universities
adalah jenis anotasi yang berisi.
public @interface Universities {
University[] value();
}
Sekarang, @University
anotasi dapat digunakan beberapa kali pada deklarasi yang sama.
@University(name = "TU")
@University(name = "KU")
private String uniName;
Jika kita perlu mengambil data anotasi, kita dapat menggunakan API Refleksi.
Untuk mengambil nilai anotasi, kami menggunakan getAnnotationsByType()
atau getAnnotations()
metode yang ditentukan dalam API Refleksi.
java
Apa itu Abstraksi di Java? Abstraksi dalam JAVA hanya menampilkan atribut penting dan menyembunyikan detail objek yang tidak perlu dari pengguna. Di Java, abstraksi dilakukan dengan menggunakan kelas Abstrak, metode Abstrak, dan Antarmuka. Abstraksi membantu mengurangi kerumitan dan upaya pemrogram
Apa itu string split() di Java? StrSplit() metode ini memungkinkan Anda untuk memutuskan string berdasarkan pembatas string Java tertentu. Sebagian besar atribut pemisahan string Java akan berupa spasi atau koma (,) yang ingin Anda putuskan atau pisahkan stringnya sintaksis fungsi split() public S
Metode Java adalah kumpulan pernyataan yang dikelompokkan bersama untuk melakukan operasi. Saat Anda memanggil System.out.println() metode, misalnya, sistem benar-benar mengeksekusi beberapa pernyataan untuk menampilkan pesan di konsol. Sekarang Anda akan mempelajari cara membuat metode Anda sendir
@Anotasi usang diperkenalkan di Java versi 5. Elemen program yang dianotasi dengan @Deprecated berarti tidak boleh digunakan karena alasan berikut − Penggunaannya dapat menyebabkan kesalahan. Mungkin tidak kompatibel di versi mendatang. Mungkin akan dihapus di versi mendatang. Alternatif yang lebih