Nurseda Özdemir
Proje Yöneticisi

Java 17: Güncel Java Kod Gözden Geçirme Kontrol Listesi

Java 17: Güncel Java Kod Gözden Geçirme Kontrol Listesi

Java 8 sonrası eklenen özellikleri kapsayan, kodun daha okunabilir olmasını sağlayan maddeler listelenmiştir.

Stream

  • Stream işlemlerinin anlaşılması kolay olmalıdır. Bu sebeple yazımı da basit olmalıdır. Bir problem Stream kullanılarak nasıl çözülür diye uzun uzun düşünmeniz gerekiyorsa, Stream kullanılmamalıdır.
  • Satır başına bir stream method çağrısı olmalıdır. Bu sayede farklı işlemler kolayca tanınabilir hale getirecektir.
  • Bir Stream ifadesinde en fazla 5 işlem yapılmalıdır.
  • Uzun Stream ifadelerini isimlendirilmeli ve birkaç küçük parçaya ayırlmalıdır.
  • Foreach işlemi nadiren kullanılmalıdır. Kullanıldığında 1-2 işlem yapılmalıdır.
  • Standart stream methodları statik import edilmeli. Bu sayede kod daha kısa, daha kolay okunur hale getirecektir.
  • Lambda yerine method referansları tercih edilmeli.
  • Türe göre filtreleme veya cast işlemleri için Class methodları kullanmalı.
  • Sık kullanılan karmaşık* collect metodları ayrı methoda çıkılmalı.
  • Primitive tiplerle çalışırken IntStream, LongStream ve DoubleStream kullanılmalı.
  • peek() methodu kullanımından kaçınılmalı.
  • Stream çalışırken collection değiştirilmemeli, değiştirildiğinde istenmeyen çıktılar olabilir.

Collections

  • Sıralamanın önemli olduğu durumlarda iterasyon için ForEachOrdered kullanılmalı, stream tarafından belirlenen sırayla iterasyon yapar. ForEach ile iterasyon yapıldığında streamin sırasının korunacağı garanti edilmez.
  • Collectionlar immutable olarak oluşturulduğunda collectionların elemanlarını silme, güncelleme, yeni eleman ekleme işlemleri yapılmamalı, UnsupportedOperationException oluşur.
  • Immutable olarak oluşturulan collectionlara null değer eklenmemeli, NullPointerException oluşur.
  • size() yerine isEmpty() tercih edilmelidir.
  • Empty collection veya array return edilmeli, null değer return edilmemelidir.
  • Return tipi olarak interface’in tipi seçilmelidir.
  • Metot argümanı olarak interface’in tipi seçilmelidir.
  • For loop yerine lambda ile forEach() kullanılmalıdır.
  • equals()’ın override edildiği her sınıfta hashCode() da override edilmelidir.
  • Arrays ve Collections’ın utility sınıfları kullanılmalıdır.

Records

  • Record’lar tüm field’lar için getter, equal, hachcode, toString ve tüm parametreleri içeren constructor’ları otomatik oluşturuyor. Ancak bu otogenerate edilen metodlar override edilebilmektedir.
    Özel bir mantıksal işlem gerekmiyorsa bunun yapılmasının bir anlamı bulunmuyor, bu yüzden tekrarlı olarak bu metodların oluşturulmasından kaçınılmalıdır.
  • Record’larda bulunan field’ların erişilebilirliğini güncellemek istediğimizde run time’da IllegalAccessException hatası alınmaktadır. Bu kural reflection ile değiştirilmeye çalışıldığında sorun ortaya çıkarmaktadır, bu yüzden kaçınılmalıdır.

  • Record’larda equals() metodunun varsayılan davranışı eşitliği alan değerlerine göre kontrol etmektir. Bu durum primitive field’lar için düzgün çalışırken array fieldlar için beklendiği gibi çalışmamaktadır. Varsayılan davranış olarak array field’lardaki eşitlik alanların referanslarına göre kontrol edilmektedir.  Bu durumda default equals metodunun geçersiz kılınması gerekmektedir. Aynı durum hashcode() ve toString() metodları için de geçerlidir.

Lambda Expression

  • Standart fonksiyonel arayüzleri(Functional interfaces) kullanmak iyi bir uygulamadır.
  • Lambda ifadelerinizi kısa tutmalısınız.
  • Parametre türlerini belirtmekten kaçının
  • Functional Interfaceleri kullanmak için lambda ifadeleri kullanın
  • Parametre olarak Functional interfacelere sahip yöntemleri aşırı yüklemekten kaçınmalısınız.
  • Functional interfacelerde Varsayılan Yöntemleri Aşırı Kullanmayın
  • Method Referanslarını Kullanın.
  • Return ve parantezlerden Kaçının
  • Tek Bir Parametre Etrafında Parantez Kullanmaktan Kaçının
  • Lambda Gövdesindeki Kod Bloklarından Kaçının

Switch Expression

  • Java 12 sonrasında gelen switch expression, değer kısmında yer alan enum değerin içindeki her bir label için case implementasyonuna zorlamaktadır. 
    Bu yüzden switch statement yerine switch expression kullanımı case implementasyonu olmayan enum değerlerinin farkedilmesini sağlar.
  • Aynı kodu işleten farklı case’ler virgül ile tek bir case olarak birleştirilebilir.
  • Switch expression ile switch statement kullanımı karıştırılmamalıdır. Switch expression bir expression ürettiği için değer döner. Bu yüzden case içinde 
    bir değer return edilmelidir. Switch statement’ta ise case içinde bir statement yer alır.
  • İçe içe geçen birden fazla switch case kullanımından kaçınılmalıdır. Switch case ile yazılan kodun mümkün olduğunca rahat okunabilir olması önemlidir.

Optional

  • Optional kullanımınan amacı null kontrollerinin yerini almak değildir.
  • Optional dolu olduğu kesin değilse Optional.get() methodu çağrılmamalıdır.
  • Optional, Return Type olması için tasarlanmıştır. Bu amaçla kullanımı daha uygundur.
  • Developerı null senaryosunu düşünmeye sevk etmek için kullanılabilir. Açık bir şekilde null dönmek yerine tercih edilebilir.
  • Entity veya DTO için Member Variable olarak kullanılmamalıdır. Optional serializable değildir.
  • Parametre olarak kullanılmamalıdır.
  • Kullanımındaki tek amaç dönüş değeri üzerine metod çağırmak ise kullanılmamalıdır. Sık kullanımı gereksiz kod yazımına neden olabilir.