Warisan Anotasi dalam Antara Muka Java
Warisan anotasi, dilambangkan dengan anotasi @Inherited, membenarkan anotasi disebarkan daripada superclass kepada subkelas. Walau bagaimanapun, pengecualian ketara kepada peraturan ini ialah anotasi pada antara muka yang dilaksanakan tidak diwarisi dengan melaksanakan kelas.
Seperti dokumentasi untuk @Inherited, "meta-anotasi ini hanya menyebabkan anotasi diwarisi daripada superclass; anotasi pada antara muka yang dilaksanakan tidak mempunyai kesan."
Penaakulan Di Sebalik Bukan Warisan
Keputusan reka bentuk ini menghalang konflik warisan dalam senario di mana kelas melaksanakan berbilang antara muka dengan anotasi bercanggah yang sama . Pertimbangkan contoh berikut:
<code class="java">@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } public interface Foo{ @Baz("baz") void doStuff(); } public interface Bar{ @Baz("phleem") void doStuff(); } public class MyClass implements Foo, Bar{}</code>
Jika anotasi diwarisi daripada antara muka, nilai @Baz yang manakah akan dikaitkan dengan kaedah MyClass.doStuff()? "baz", "phleem" atau sesuatu yang lain?
Implikasi Praktikal
Warisan anotasi pada antara muka biasanya dianggap tidak biasa dan tidak praktikal kerana potensi konflik dan kesukaran dalam menentukan anotasi yang sah apabila berbilang antara muka menentukan anotasi bercanggah. Adalah dinasihatkan untuk bergantung pada anotasi pada superclass atau menggunakan mekanisme alternatif untuk pemintasan kaedah dalam rangka kerja suntikan pergantungan.
Atas ialah kandungan terperinci Mengapa Antara Muka Java Tidak Mewarisi Anotasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!