Java Gereksiz Objelerden Kaçınma
Bazen Java’da farkında olmadan gereksiz nesnelerin arkada oluşmasına sebebiyet veriyoruz. Effective Java kitabında 6.Maddede bu konudan…
Java Gereksiz Objelerden Kaçınma
Bazen Java’da farkında olmadan gereksiz nesnelerin arkada oluşmasına sebebiyet veriyoruz. Effective Java kitabında 6.Maddede bu konudan bahsetmiş. Verdiğim örnekler referans olarak kitabı almıştır.
Java’da çoğunlukla yeni bir nesne yaratmak yerine eski nesneyi kullanmak çok daha avantajlı ve performanslı. Java nesnelerin tekrar kullanılabilir olması için nesnelerin immutable(değiştirilemez) olmasını ister.
[embed]
Buradaki “s” String’i her çağrıldığında yeni bir nesne yaratılacak ve hepsi “bikini” değerini alacak. Bunun yerine sadece bir tane oluşturup direkt onu kullanmak kodlama bilmeyen biri için bile daha mantıklıdır. Zaten bu kullanımı pek kullanan kişi yok. Peki doğrusu nasıl olmalı?
[embed]
Bu şekilde kullanımda Java nesneyi sadece bir kere oluşturacak ve “s” çağrıldığında hep aynı nesneyi dönecek. Hata başka bir String’e “bikini” değerini atarsak onun için yeniş bir nesne yaratmayıp ikisinin de aynı nesneyi kullanmasını sağlayacaktır. Bu durum kodun daha performanslı olmasını sağlar.
Gereksiz obje oluşturmadan kaçınmak için Static Factory Method(statik fabrika metod) kullanılabilir. Constuructor kullanımında yeni bir obje oluşurken Static Factory Method yeni bir nesne oluşturmaz.
Örneğin Boolean(String) yerine Boolean.valueOf(String) kullanalması. Boolean(String) bir constuructordur ve yeni bir nesne oluşmasına sebep olurken Boolean.valueOf(String) Static bir metod olduğu için yeni bir nesne oluşturmaz. Java bu kullanımı arttırmak için Java9 ile beraber Boolean(String) kullanımı deprecate etmiştir.
Peki başka neler yapılabilir? Bazı üretmesi maliyetli nesneleri tekrar tekrar ihtiyaç duyduğumuz durumlarda, yeniden üretmek yerine hafızada tutulması önerilmektedir. Hemen verilen String değerinde roman rakamları var mı yok mu ona bakan bir metod ile açıklayalım.
[embed]
Buradaki problem String.Matches() metodu çağrıldığı zaman yeni bir Pattern nesnesi oluşturması ve burada direkt return olarak verildiği için bu değer kayıt edilmiyor. Garbage Collector tarafından temizlenmeyi bekleyecektir. Peki nasıl daha iyi kullanılabilirdi?
[embed]
Bu kullanım diğerine göre çok daha performanslıdır. 8 karakterli bir Stringte bile 6.5 kat daha hızlı olduğu gözlemlenmiştir. Aynı zamanda sadece performans artışı değil daha okunaklı ve anlaşılır bir kod haline geldi.
Peki bu kullanımın dezavantajı nedir? Pattern static olarak oluşturulduğu için hiç bir yerde kullanılmazsa yine bir gereksiz nesne oluşturmuş olacağız. Bunu Lazy metodu gibi sadece metod ilk çağrıldığında oluşmasını ve diğer çağrılmalarda ise aynı nesneyi dönmesi sağlanabilir ama bu kodu karmaşıklaştıracaktır.
Bana gör en dikkat edilmesi gereken yazarken bazen fark edemediğimiz “Autoboxing” ve “Unboxing” özelliklerine. Normalde Java bu özelliği bizim her şeyi yazmamamız için yapılmış güzel bir özellik olmasına rağmen bazen çok fazla gereksiz nesneye sebebiyet verebiliyor peki nasıl?
[embed]
Kodun mantığı basit 0 dan başlayarak integerin en üst değerine kadar olan tüm sayıları toplamak. Peki bu kodu kötü yapan yer neresi?
Sum değeri ilk tanımlanırken Long diye tanımlanmış sonrasında ise sum değeri long tanımlı i değeri ile toplanmış bu da her toplanma işleminde neyi bir Long nesnesinin oluşmasına sebebiyet veriyor.
Aslında “sum += i;” kodu arka tarafta “sum= new Long(sum.longValue() + i);” olarak derleniyor. Bu durum büyük bir kaynak kaybı oluşturuyor. Bunun önünce geçmek için İlkel tipler ile işlem yaptığımızda diğer tarafı da ilkel tipte seçmek gerekmektedir.
Peki burada 2³¹ tane yeni Long nesnesine oluşmasına rağmen nasıl bir zaman kaybına uğradık. Long sum değeri long sum olarak tanımlansaydı 6.3 saniye yerine 0.59 saniyede proje ayağa kalkacaktı. Bu değer azımsanacak bir değer değil ama illa yapmanız gerekiyorsa kullanmaktan çekinmeyin. Sadece gereksiz kullanımlara dikkat etmekte fayda var.
Java Garbage Collector aslında işini çok iyi yapıyor ama dikkat etmekte ve mümkünse bunları uygulamakta fayda görüyorum.
메타데이터
- post_id
- 26e3a142e6ee
- slug
- java-gereksiz-objelerden-kaçınma-26e3a142e6ee
- url
- https://medium.com/@erkanntekel/java-gereksiz-objelerden-ka%C3%A7%C4%B1nma-26e3a142e6ee
- canonical_url
- https://medium.com/@erkanntekel/java-gereksiz-objelerden-ka%C3%A7%C4%B1nma-26e3a142e6ee
- author_url
- https://medium.com/@erkanntekel
- status
- ok
- fetched_at
- 2026-07-26 21:44:25