• Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim
KodEdu
  • Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim

Java 8 – Tekrarlı Notasyonlar Nasıl Kullanılır?

  • Posted by Kodedu
  • Categories backend, Genel, Uncategorized, Yazılar
  • Date 23 Eylül 2014

Notasyonlar (Annotations) Java 5’den beri Java ortamında kullanılan bileşenlerdir. Notasyonlar genel olarak bir bileşene özellik katma veya konfigürasyon amaçlı olarak kullanılmaktadır. Bu yazıda notasyonların genel özelliklerinden ve Java 8 Repeated Annotations yeniliğinden bahsedilecektir.

Notasyonlar @ işaretiyle başlayan arayüzlerdir ve notasyonlar içinde alanlar tanımlanabilmektedir.

Örneğin;

@Single Notasyonu
public @interface Single {

    String value();

}

Notasyonlar çeşitli alanlara uygulanabilmektedir. Bu alanlar;

Nereye uygulanabilir? Açıklama

TYPE

Sınıf, arayüz, soyut sınıf başlarına

METHOD

Metod başlarına

FIELD

Global alan başlarına

PARAMETER

Metod parametrelerine

CONSTRUCTOR

Constructor başına

ANNOTATION_TYPE

Notasyonların başına

PACKAGE

Paket deklarasyonu başına

Hangi notasyonun nereye veya nerelere uygulanabileceği, notasyonu yazan tarafından belirtilmektedir. Bu belirtim işlemi ise @Target isimli notasyon ile sağlanmaktadır.

Örnek 1
@Target({ElementType.METHOD})
public @interface Single {

    String value();

}

@Single notasyonunun uygulanabilirlik alanı METHOD olarak tanımlandığı için, @Single notasyonu sadece metod başlarında kullanılabilir. Diğer alanlarda kullanılamaz, kullanılmaya kalkışılırsa derleme zamanında hata alınır.

Uygulama 1
@Single // Buraya konamaz
public class App {

    @Single // Buraya konabilir
    public void doIt() {

    }
}

Örnek 2
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Single {

    String value();

}

Şimdi ise @Single notasyonu hem metod başlarına hem de sınıf, arayüz, soyut sınıf gibi bileşenlerin başlarına eklenebilir.

Uygulama 2
@Single // Artık buraya da konabilir
public class App {

    @Single // Buraya uygulanamaz :(
    String message = "Merhaba Dünya";

    @Single // Buraya konabilir
    public void doIt() {

    }
}

@Target notasyonu ile yapılan aslında, notasyonun uygulanabilirlik alanını, yani yetki alanını belirlemektir. Örneğin Uygulama 2‘de uygulanabilirlik alanı olarak METHOD ve TYPE belirlenmiştir. Bu sebeple sadece bununla ilgili kısımlara @Single notasyonu uygulanabilir.Mesela örnekte olduğu gibi global alanlara uygulanamaz. Eğer buraya da uygulanabilir olması istenirse FIELD enum bileşeni @Target notasyonuna eklenmelidir.

Notasyonlar ve Alanları

Notasyonlar konfigürasyon amacıyla kullanılırken, barındırdığı değişken alanlarından faydalanılmaktadır. Bu alanların tipi, ismi ve gerekirse varsayılan değeri tanımlanabilmektedir.

Fakat bu alanlarda tip sınırlaması vardır, bu tipler şunlar olabilir;

String

Temel tipler

Class

Bir Enum tipi

Diğer bir notasyon tipi

Yukarıdaki tiplerin dizi tipleri

@Single notasyonunu düşünürsek String türünde value adında tek bir alana sahiptir. Değer ataması ise deklerasyon anında () içerisinde yapılmaktadır.

Örneğin;
@Single(value="Merhaba Dünya")
public interface Hello {

}

Notasyonlar için value alanının özel bir anlamı vardır. Eğer başka bir alana değer ataması yapılmayacaksa value yazılmasa bile bu değer ataması value alanına yapılmaktadır.

Örneğin;
@Single("Merhaba Dünya") (1)
public interface Hello {

}
  1. Denktir @Single(value="Merhaba Dünya")

Notasyonlara Erişim

Notasyonların nereye uygulandıkları ve içerisinde barındırdıkları veriler derleme zamanında (compile time) veya çalışma zamanında (runtime) elde edilebikmektedir. Fakat bir notasyona hangi zamanlarda erişilebileceği @Retention isimli notasyon ile belirtilmelidir. Retention (tutma) politikasının 3 tipi vardır.

SOURCE
Notasyonlar derleme zamanında yok sayılır.

CLASS
Notasyonlar derleme zamanında sınıf içerisinde bulundurulur, fakat çalışma zamanında bulunması zorunlu değildir. Varsayılan hal budur.

RUNTIME
Notasyonlar çalışma zamanında erişilmek üzere sınıf içerisinde bulundurulur. Çalışma zamanında erişim Java Reflection API ile yapılır. Sık kullanılan hal budur.

Not
Rastgele 10 notasyon belirleyip, @Retention notasyonunu incelediğinizde %90 üzeri ağırlıkta tutma politikasının RUNTIME olarak yapılandırıldığını görebilirsiniz.

Örneğin;
@Target({ElementType.METHOD, ElementType.TYPE}) (1)
@Retention(RetentionPolicy.RUNTIME) (2)
public @interface Single {

    String value();

}
  1. Metod ve Sınıfların başına uygulanabilir.
  2. Çalışma zamanında bu notasyona erişilebilir.

Yukarıda @Target ve @Retention notasyonlarıyla yapılandırılmış kullanıma hazır bir @Single notasyonunu görüyoruz.

Notasyonların Tekrarlı Kullanılması

Java 8 öncesinde bir notasyon, iki kere aynı yerde kullanılamamaktaydı.

Hatalı kullanım örneği;
@Single("Merhaba")
@Single("Jupiter")
public class App {


}

Örneğin @Single notasyonu yukarıdaki gibi aynı alanda kullanılamaz. Bu sınırlılık Java 8 öncesinde ikincil bir notasyon üzerinden aşılmaktaydı.

Örneğin;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Multiple {

    Single[] value();
}

Multiple notasyonu Single tipli diziler barındırabilen bir value alanına sahiptir. Artık Multiple notasyonu üzerinden birden fazla @Single notasyonu uygulanabilirdir.

Doğru kullanım örneği;
@Multiple(value = {
    @Single("Merhaba"),
    @Single("Jupiter")
})
public class App {


}
Not
Notasyonlarda dizi tipli alanlara atamamalar, { } arasında virgül , ile ayrılmış olarak yapılmaktadır.

Java 8 ile birlikte bu sınırlılık ortadan kalkmıştır. Bu sınırlılığı ortadan kaldırmak için @Repeatable notasyonundan faydalanılmaktadır.

@Repeatable(Multiple.class) // Dikkat

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Single {
    String value();
}

@Repeatable notasyonu tekrarlayacak notasyona uygulanmaktadır. @Repeatable ntoasyonunun value alanına ise, sarmalayıcı notasyonun sınıf tipi tanımlanmalıdır. Bu yolla tekrarlı notasyonlar alt alta, yan yan istendiği kadar tanımlanabilmektedir.

Örneğin;
@Single("Merhaba")
@Single("Uranüs")
public class App {

  public static void main(String[] args) {

        Class<App> app = App.class; (1)
        Single[] notz = app.getAnnotationsByType(Single.class); (2)

        for (Single not : notz) { (3)
            System.out.println(not.value()); (4)
            // Merhaba
            // Uranüs
        }

    }

}
  1. App sınıfının sınıf tipini alır.
  2. App sınıfına uygulanmış tüm Single tipli notasyonları bulur.
  3. Tüm uygulanmış Single notasyonlarını dolaşır.
  4. O anki Single notasyonunun value() alanını çıktılar.

Tekrar görüşmek dileğiyle.

Tag:anotasyon, backend

  • Share:
author avatar
Kodedu

Previous post

Java 8 Lambda Örnekleri
23 Eylül 2014

Next post

Java 8 - Method Reference
29 Eylül 2014

You may also like

api-logo
Swagger Nedir? Neden kullanılır?
10 Ekim, 2018
spring-cli-logo
Spring CLI ile Spring Boot Projeleri Hazırlamak
21 Ağustos, 2017
eureka_architecture
Spring Cloud Netflix ve Eureka Service Discovery
3 Temmuz, 2017

Leave A Reply Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta listesine kayıt olun!






Gözde yazılar

Java Mimarisiyle Kurumsal Çözümler : Kurumsal Java Kitabı
16Eyl2012
Java API for JSON Processing – Stream bazlı JSON Üretmek ve Tüketmek
06Ağu2013
AsciidocFX projesi Duke’s Choice Award 2015 ödülünü kazandı
28Eki2015
Knockout.js – Hesap Makinesi Örneği
02Şub2013

Son Yazılar

  • Java’da Record’lar 27 Ocak 2020
  • Swagger Nedir? Neden kullanılır? 10 Ekim 2018
  • Spring CLI ile Spring Boot Projeleri Hazırlamak 21 Ağustos 2017
  • Spring Cloud Netflix ve Eureka Service Discovery 3 Temmuz 2017
  • Online React.js Eğitimi ardından (15-25 Mayıs 2017) 31 Mayıs 2017

Son Yorumlar

  • Coupling ve Cohesion Kavramları Nedir? için Hilal
  • Naïve Bayes Sınıflandırma Algoritması için Rahman Usta
  • Naïve Bayes Sınıflandırma Algoritması için Mete
  • YAML Nedir? Neden YAML Kullanmalıyız? için kara
  • JWT (JSON Web Tokens) Nedir? Ne işe yarar? için Furkan

Get Java Software

Arşivler

Bizi takip edin

React.js Eğitimi Başlıyor
11-22 Eylül, 2017
Eğitmen
Rahman Usta
İletişim

merhaba@kodedu.com

  • Hakkında
  • Gizlilik Politikası
  • İletişim
  • Referanslar
Kodedu Bilişim Danışmanlık
Cemil Meriç mah. Çelebi sok.
No:16/3 Ümraniye/İSTANBUL
Tel: 0850 885 38 65
Alemdağ V.D.: 8960484815

KODEDU © Tüm hakları saklıdır.