Sorunun Tarihi:
Java'nın başlangıcından itibaren, sınıfın statik üyeleri kavramı, örnek üyelerden farklı olarak ortaya çıktı — bu değişkenler, nesne yerine sınıf seviyesinde saklanır. Bu, verilerin sınıfın tüm örnekleri arasında paylaşılmasını veya sabitler ve hizmet yapıları kullanılmasını sağlar.
Sorun:
Statik alanların ana görevi, sınıfın tüm nesneleri için veri sağlamaktır veya tek bir erişim noktasını gerçekleştirmektir. Ancak, statik kullanımı hatalı olduğunda, global durum ile ilgili yakalanması zor hatalara, veri yarışmalarına ve test sorunlarına yol açabilir.
Çözüm:
Statik alanlar, static anahtar kelimesi ile tanımlanır:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
Her yeni örnek oluşturulduğunda sayıcı artar ve değer Counter.globalCount üzerinden erişilebilir, nesneden bağımsız olarak.
Anahtar özellikler:
Statik bir alana nesne üzerinden değil, sınıf adı üzerinden erişebilir miyiz?
Evet, sözdizimi bir statik alana nesne üzerinden erişimi mümkün kılar, ancak bu okunabilirliği azaltır ve bazen kafa karıştırıcı koda yol açar. Her zaman sınıf adı üzerinden erişmek daha iyidir.
Counter c = new Counter(); System.out.println(c.globalCount); // Çalışır, ama önerilmez
Statik alanlar özel olabilir mi?
Evet, erişim seviyesi hiçbir şekilde kısıtlı değildir. Özel statik alanlar genellikle kamuya açık statik yöntemlerle bir arada kullanılır (örneğin, Singleton için):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
Statik bir alanı, belirli bir nesneye bağlı bir değerle başlatmaya çalışırsak ne olur?
Böyle bir kod derlenmez, çünkü nesneye bağlı alanlar statik alanlardan sonra başlatılır. Statik bir alan doğrudan nesneye bağlı bir değere atıfta bulunamaz.
Büyük uygulamalarda kullanıcıya özgü, önbelleğe alınmış verileri saklamak için statik alan kullanılır.
Artıları:
Eksileri:
Hata kodları veya standart parametreler gibi sabitleri saklamak için public static final String kullanımı.
Artıları:
Eksileri: