Anotasyon

Java 8 – Date API ile Gelen Yenilikler

Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize Java 8 Yenilikleri başlığı altında üçüncü yazımız olan Date API ile Gelen Yenilikler ile devam ediyoruz. Akabinde devam edecek serinin içeriklerini buradan takip edebilirsiniz.

Java Date API nedir?

Java 8 ile birlikte gelen bu yenilik java.util paketi altında yer alan Date ve Time sınıflarında bulunan eksiklikleri gidermek ve bazı sorunları ele almak için geliştirildi. Öncelikle var olan kısımda neler vardı ve Java 8 Date Api ile hayatımıza neler girdi, bakalım.

Öncelikle Java 8 öncesindeki Date ve Time sınıfları thread safe değildi. Peki thread safe ne demek? Kısaca bahsetmek gerekirse; Thread safe çoklu thread yapılarda karşımıza çıkan, birden çok thread’in bir kaynağa eriştiği durumlarda thread’lerin kilit (deadlock) oluşturmadan işlerini bitirmelerini sağlayan mekanizmadır. Bu genellikle bir kaynaktan veri okurken değilde kaynağa erişmeye çalışıldığı durumlarda, değerleri değiştirmek istediğimizde başımıza gelebilecek bir durumdur. Java’da immutable (değişmezlik) sınıflar thread safe’dir.

Konumuza dönecek olursak Java 8 ile birlikte gelen Date ve Time sınıfları immutable yani thread safe’dir. Böylelikle çoklu thread yapılarda bizleri thread senkronizasyonu probleminden korur. Java 8’den önce saat dilimini yönetmek için ekstra util class dediğimiz yardımcı sınıflar yazıyorduk java 8 ile birlikte Local ve ZonedDateTime bunları bizim için yapıyor.

Çoğunlukla en yaygın kullanulan sınıflar LocalDate, LocalTime ve LocalDateTime’dır. İsimlerinden de anlayacağınız üzere yerel zaman dilimleri hakkında bilgi vermektedir.

LocalDate ve LocalTime

Yeni Date Api’yi kullanırken karşılaşacağınız ilk sınıflar LocalDate ve LocalTime olacaktır. Başka bir sınıuf olan LocalDateTime, bu iki sınıfın birleşimi olacak düşünülebilir. Bu sınıflar, tutarlı zaman dilimlerine sahip olan dağıtık sistemlerde zamanı temsil etmek için kullanılabilir.

Yeni Date Api ile gelen sınıflar Fluent Factory tasarım desenini kullanmaktadır. Buradaki Fluent Factory tasarım desenini kısaca bahsetmek gerekirse daha elverişli, okunaklı ve akıcı kod yazmamızı sağlayan bir yöntem. Bir sınıfın metodlarının sürekli sınıfında kendisini döndürdüğünü ve sürekli olarak o sınıfa bir anlam yüklediğinizi düşünün. Daha net olması açısından hemen bir örnek ile pekiştirelim.

LocalDate localDate1 = LocalDate.of(2018, 10, 15);
LocalDate localDate2 = LocalDate.of(2018, Month.OCTOBER, 15);

System.out.println(localDate1);
System.out.println(localDate2);

Yukarıdaki örnekte LocalDate sınıfının of metodunu kullandık iki farklı kullanımı görmektesiniz. Her ikiside aynı çıktıyı vermektedir. of metodu geriye LocalDate döndürür ve dönen değer üzerinde başka LocalDate işlemleri yapmanıza olanak tanır.

LocalDate localDate1 = LocalDate.of(2018, 10, 15).plusDays(5);

Mesela dönen gün değerine 5 gün eklemek gibi düşünebilirsiniz. Sonuç olarak 2018, 10, 20 değerini göreceksiniz.

Yukarıda bahsettiğim Fluent Factory tasarım deseni bu minvalde geliştirilmiştir.

LocalDate sınıfına geri dönecek olursak bazı yardımcı metodlarını göstermek istiyorum.

LocalDateTime localDateTime = LocalDateTime.now(); // yyyy-MM-ddThh:mm:ss

LocalDate theDate = localDateTime.toLocalDate();
int month = localDateTime.getMonth().getValue();
int day = localDateTime.getDayOfMonth();
int second = localDateTime.getSecond();

Yukarıda belirli bir tarihin ay, gün ve yıl cinsinden değerlerinin nasıl okunduğu gösterilmiştir.

Aynı şekilde LocalTime sınıfı da aşağıdaki gibi kullanılabilir.

LocalTime localTimeNow = LocalTime.now();
System.out.println(localTimeNow);

LocalTime localTime = LocalTime.now();
System.out.println("Saat : " + localTime.getHour());
System.out.println("Dakika : " + localTime.getMinute());
System.out.println("Saniye : " + localTime.getSecond());

Yukarıda localTimeNow nesnesi uygulamanın o an çalıştığı sistem üzerindeki saati verir ve ardından da göreceğiniz üzere saat, dakika ve saniye’nin nasıl alındığını gördük.

Clock

Java 8 ile gelen Clock sınıfı bizlere sistemin bulunduğu bölgeye dayanarak bazı zaman bilgileri sunar.

Clock clock = Clock.systemDefaultZone();
ZoneId zone = clock.getZone();
System.out.println(zone.getId());;

Örneğin yukarıda uygulamanın çalıştığı sistemin hangi bölgede bulunduğunun bilgisini almış olduk. Bu kod parçasını çalıştırdığınızda çıktı olarak Europe/Istanbul verecektir. Çünkü kodu çalıştırdığım sistem Istanbul’da yer almaktadır.

Clock clock = Clock.systemDefaultZone();
System.out.println(clock.millis());

System.out.print(System.currentTimeMillis());

Yukarıda, bulunduğumuz bölge üzerinde anlık saati milisaniye cinsinden göstermiş olduk. Bu tür kullanımları anlık rastgele sayı üretmede kullanabilirsiniz. Her çalıştığı anda farklı sayı üreteceğinden milisaniye bazında aynı değer üretme ihtimali çok düşüktür. Çıktısı long değer olarak görebilirsiniz. Mesela; 1542837957763

Clock ile kullanılan bir başka metod offset^dir. Belirli bir an örnek alınarak o an ile herhangi saat değeri üzerine eklenerek istenilen tarihe gidilir. Mesela şu an dan 5 saat sonrasını istemek ya da “-” değer verdiğiniz 5 saat geriye gitmek gibi düşünebilirsiniz.

Clock clock = Clock.systemDefaultZone();

Clock clock1 = Clock.offset(clock, Duration.ofHours(5));
System.out.println(clock1.instant());

Clock clock2 = Clock.offset(clock, Duration.ZERO);
System.out.println(clock2.instant());

Clock clock3 = Clock.offset(clock, Duration.ofHours(-10));
System.out.println(clock3.instant());

Yukarıda göreceğiniz üzere offset metodunun ikinci parametresi olan Duration sınıfının ofHours metoduna saat değeri parametre geçilerek istenilen tarihe gidilebilir. Örneğin ilk örnekte 5 saat sonrasını, ikinci örnekte herhangi bir değişiklik olmadan ve üçüncü örnekte ise 10 saat geri değer döndürür.

Bazen de saati sabit tutmamız gereken durumlar olabilir. Metodunuz zamana bağımlı bir şekilde çıktısı değişen bir metodunuz olduğunu düşünün ve bu metoda test yazarken zamanında sabit kalmasını ve o sabit kalan zamana göre testinizi yazmanız gerekebilir böyle durumlarda zamanı istenilen anda sabit tutabilirsiniz.

Instant instant = Instant.now();
ZoneId zoneId = ZoneId.systemDefault();
Clock clock = Clock.fixed(instant, zoneId);
System.out.println(clock.toString());

Çıktı ekranında programın çalıştığı andaki saat dilimini göreceksiniz ve böylelikle saati sabit bir değerde tutmuş olursunuz.

Böylelikle Java 8 ile birlikte gelen Date Api hakkında temel bilgileri gösterdik, daha ayrıntılı bilgi edinmek için faydalandığım kaynaklara buradan ve buradan erişebilirsiniz.

Umarım faydalı olmuştur.

Bir sonraki yazımızda Java’da özel anotasyon yazımını öğreneceğiz, Bildiğiniz üzere anotasyonlar Java 5 versiyonundan itibaren var hem Java 8 öncesindeki kullanımından bahsedeceğiz hemde Java 8 ile birlikte gelen özelliklere değineceğiz.

Hoşçakalın.

14

Yusuf Çakal

Cumhuriyet Üniversitesi - Bilgisayar Mühendisliği (2014-2018)

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?