CodeBlanks Logo Icon CodeBlanks

Özet - Annotation

@interface ve @Retention'ı birleştirerek bir işaretleme framework'ü yazarsın.

Özet - Annotation

Bu grupta annotation'ları öğrendik: @interface ile tanımlama, @Retention ve @Target ile davranışını belirleme, öğe ve default değerleri ve reflection ile okuma. Şimdi tekrar annotation'ları bir araya getireceğiz.

Yerleşik annotation'lar derleyiciye ipucu verirken, kendi tanımladıklarımız çerçevelerin sınıfları otomatik keşfetmesini sağlar. Bir annotation'ın çalışma anında okunabilmesi için RUNTIME retention şarttır. Şimdi son bir özellik olan repeatable annotation'lara bakalım.

Repeatable annotation

Normalde bir annotation aynı öğeye iki kez uygulanamaz. @Repeatable meta-annotation'ı bu kısıtı kaldırır; ancak bir taşıyıcı annotation tanımlamak gerekir.

Taşıyıcı, tekrar edilen annotation'ın dizisini tutan bir annotation'dır: @interface Roles { Role[] value(); }. Tekrar edilebilir annotation @Repeatable(Roles.class) ile işaretlenir. Sonra @Role("admin") @Role("editor") biçiminde aynı öğeye iki kez uygulanabilir; reflection ile getAnnotationsByType(Role.class) ikisini de döndürür.

Uygulama Repeatable Role annotation'ını say

Bir @interface Role tanımla: String value(), üstüne @Repeatable(Roles.class), @Retention(RUNTIME), @Target(TYPE). Bir @interface Roles taşıyıcı tanımla: Role[] value(), üstüne @Retention(RUNTIME) @Target(TYPE). User sınıfına @Role("admin") ve @Role("editor") ekle. main içinde getAnnotationsByType(Role.class).length sonucunu System.out.println ile yazdır.

Başlangıç kodu

Main.java
// Role annotation'ını ve Roles taşıyıcıyı tanımla
// User sınıfına iki Role ekle
// main içinde sayıyı yazdır

Örnek çözüm

Main.java
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(Roles.class)
@interface Role { String value(); }

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Roles { Role[] value(); }

@Role("admin")
@Role("editor")
class User { }

public class RoleCount {
    public static void main(String[] args) {
        int n = User.class.getAnnotationsByType(Role.class).length;
        System.out.println(n);
    }
}

Beklenen çıktı

2

Uygulama Version annotation'ını denetle ve oku

Bir @interface Version tanımla: int value(), üstüne @Retention(RetentionPolicy.RUNTIME) ve @Target(ElementType.TYPE). App sınıfına @Version(3) ekle. main içinde önce isAnnotationPresent ile varlığını, sonra getAnnotation ile değerini System.out.println ile yazdır.

Başlangıç kodu

Main.java
// Version annotation'ını tanımla (RUNTIME, TYPE)
// App sınıfına Version uygula
// main içinde varlık ve değer yazdır

Örnek çözüm

Main.java
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Version { int value(); }

@Version(3)
class App { }

public class VersionCheck {
    public static void main(String[] args) {
        System.out.println(App.class.isAnnotationPresent(Version.class));
        System.out.println(App.class.getAnnotation(Version.class).value());
    }
}

Beklenen çıktı

true
3

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir annotation'ı reflection ile okumak için hangi retention gerekir?

  • RetentionPolicy.SOURCE
  • RetentionPolicy.CLASS
  • ElementType.METHOD
  • RetentionPolicy.RUNTIME Doğru cevap

Açıklama: RUNTIME annotation'lar reflection ile okunur.

2 @Repeatable tanımını tamamla

Soru
@Repeatable(____.class)
Cevap
@Repeatable(Roles.class)

Açıklama: Taşıyıcı annotation sınıfı verilir.

İleri seviye bölümündeki tüm dersler