0Pricing
Java Academy · Ders

Statik Alanlar ve Sabitler

Paylaşılan durum için statik alanları, static final ile sabitleri ve statik başlatıcıları kullanın.

Statik Alanlar ve Sabitler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Statik Alanlar ve Sabitler

Statik alanlar örneklere değil, sınıfa aittir. Sınıfın tüm nesneleri arasında paylaşılırlar. Sabitler, sınıf düzeyinde değiştirilemez değerler oluşturmak için statik ve final özelliklerini birleştirir.

Statik ve Örnek Alanları

Bir örnek alanının her nesne için ayrı bir kopyası vardır. Statik alanın ise sınıfın tüm nesneleri tarafından paylaşılan tek bir kopyası bulunur.

class Counter {
    private static int totalCount = 0;  // shared across all instances
    private int instanceId;              // unique per instance

    Counter() {
        totalCount++;
        instanceId = totalCount;
    }

    static int getTotalCount() { return totalCount; }
    int getInstanceId()        { return instanceId; }
}

Counter c1 = new Counter();
Counter c2 = new Counter();
Counter c3 = new Counter();

System.out.println(Counter.getTotalCount()); // 3
System.out.println(c1.getInstanceId());       // 1
System.out.println(c3.getInstanceId());       // 3

static final ile Sabitler

Sabitleri public static final olarak tanımlayın. Geleneksel olarak SCREAMING_SNAKE_CASE kullanırlar.

class MathConstants {
    public static final double PI      = 3.141592653589793;
    public static final double E       = 2.718281828459045;
    public static final double GOLDEN  = 1.618033988749895;
    public static final int    PRIMES[] = {2, 3, 5, 7, 11, 13};
}

// Access without an instance
System.out.println(MathConstants.PI);

// Constants on domain classes
class HttpStatus {
    public static final int OK        = 200;
    public static final int NOT_FOUND = 404;
    public static final int SERVER_ERR = 500;
}

Statik Başlatıcı Blokları

Bir sabit karmaşık başlatma gerektirdiğinde, sınıf yüklendiğinde bir kez çalıştırılan bir statik başlatıcı bloğu kullanın.

import java.util.*;

class Config {
    public static final Map<String, String> DEFAULTS;

    static {
        Map<String, String> map = new HashMap<>();
        map.put("timeout",  "30");
        map.put("maxRetry", "3");
        map.put("logLevel", "INFO");
        DEFAULTS = Collections.unmodifiableMap(map);
    }
}

System.out.println(Config.DEFAULTS.get("timeout")); // 30

Statik Sayaç Örüntüsü

Statik alanlar genellikle ID üretimi, ölçüm sayımı veya paylaşılan önbellekler için kullanılır.

import java.util.concurrent.atomic.AtomicLong;

class Order {
    private static final AtomicLong ID_SEQUENCE = new AtomicLong(1000);

    private final long id;
    private final String item;

    Order(String item) {
        this.id   = ID_SEQUENCE.getAndIncrement();
        this.item = item;
    }

    long getId()   { return id; }
    String getItem() { return item; }
}

Order o1 = new Order("Laptop");
Order o2 = new Order("Mouse");
System.out.println(o1.getId()); // 1000
System.out.println(o2.getId()); // 1001

Statik Alanla Tekil Örneği

Bir tekil örüntüsünde tek örneği bir statik alan tutar. Her zaman gerekmeyebilecek sınıflar için tembel başlatma kullanın.

class DatabasePool {
    private static volatile DatabasePool instance;
    private final int maxConnections;

    private DatabasePool() { this.maxConnections = 20; }

    public static DatabasePool getInstance() {
        if (instance == null) {
            synchronized (DatabasePool.class) {
                if (instance == null)
                    instance = new DatabasePool();
            }
        }
        return instance;
    }

    public int getMaxConnections() { return maxConnections; }
}

System.out.println(DatabasePool.getInstance().getMaxConnections()); // 20

Statik İçe Aktarma

import static, sınıf adı öneki olmadan statik üyeleri kullanmanızı sağlar — sabitler ve yardımcı metotlar için kullanışlıdır.

import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
import static java.lang.Math.pow;

// Without import static: Math.PI * Math.pow(r, 2)
double radius = 5.0;
double area = PI * pow(radius, 2);
System.out.printf("Area: %.2f%n", area); // 78.54

// Caution: overuse of static imports hurts readability
// Acceptable for: Math.*, Assert.* in tests, TimeUnit

Statik Alanların İş Parçacığı Güvenliği

İş parçacıkları arasında paylaşılan statik alanlar, yarış koşullarını önlemek için eşzamanlama veya atomik türler gerektirir.

import java.util.concurrent.atomic.*;

class RequestMetrics {
    private static final AtomicLong requestCount  = new AtomicLong(0);
    private static final AtomicLong totalLatencyMs = new AtomicLong(0);

    public static void record(long latencyMs) {
        requestCount.incrementAndGet();
        totalLatencyMs.addAndGet(latencyMs);
    }

    public static double averageLatency() {
        long count = requestCount.get();
        return count == 0 ? 0 : (double) totalLatencyMs.get() / count;
    }
}
RequestMetrics.record(45);
RequestMetrics.record(120);
System.out.println(RequestMetrics.averageLatency()); // 82.5

Mutable Statik Alanlar: Tuzaklar

Mutable statik alanlar tehlikelidir: küresel değiştirilebilir durumun sınanması zordur, dikkat edilmezse iş parçacığı açısından güvenli değildir ve sınıflar arasında gizli bağımlılık oluşturur.

// BAD: mutable static state
class GlobalConfig {
    public static String environment = "dev"; // mutable global!
}
// Any code anywhere can change GlobalConfig.environment
// Very hard to test, unexpected interactions

// BETTER: immutable constant
class GlobalConfig2 {
    public static final String ENVIRONMENT =
        System.getenv().getOrDefault("APP_ENV", "dev");
}

// BEST: inject via constructor (dependency injection)
class Service {
    private final String environment;
    Service(String environment) { this.environment = environment; }
}

Sabit Arayüzü Karşıt Örüntüsü

Sabitleri tutmak için bir arayüz kullanmak ("Sabit Arayüzü" karşıt örüntüsü) önerilmez. Bunun yerine özel kurucusu olan bir sınıf kullanın.

// BAD: constant interface — pollutes the namespace of implementing classes
interface FinancialConstants {
    double TAX_RATE = 0.08;  // implicitly public static final
}

// GOOD: utility class for constants
final class FinancialConstants2 {
    private FinancialConstants2() {} // prevent instantiation

    public static final double TAX_RATE  = 0.08;
    public static final double VAT_RATE  = 0.20;
    public static final int    MAX_ITEMS = 100;
}
System.out.println(FinancialConstants2.TAX_RATE); // 0.08

Pratik: Sabitlerle Özellik Bayrakları

Derleme zamanı özellik bayrakları için statik final boolean sabitlerini kullanmak — JIT derleyicisi ölü dalları ortadan kaldırır.

class Features {
    public static final boolean ENABLE_ANALYTICS   = true;
    public static final boolean ENABLE_AI_SEARCH    = false;
    public static final boolean DEBUG_MODE          =
        "true".equals(System.getenv("DEBUG"));
}

// The JIT eliminates this if-block when ENABLE_AI_SEARCH is false:
if (Features.ENABLE_AI_SEARCH) {
    System.out.println("Running AI search...");
}

if (Features.DEBUG_MODE) {
    System.out.println("[DEBUG] Request received");
}

Kısa Kontrol

Statik alan ile örnek alanı arasındaki fark nedir?

Özet: Statik Alanlar ve Sabitler

Önemli noktalar:

  • Statik alanlar sınıfa aittir — tüm örnekler tarafından paylaşılan tek bir kopya bulunur
  • Sabitler: public static final UPPER_SNAKE_CASE
  • Karmaşık başlatma gerektiren sabitler için statik başlatıcı blokları kullanın
  • Eşzamanlı kodda değiştirilebilir statik alanlar için AtomicLong/AtomicInteger kullanmayı tercih edin
  • Değiştirilebilir statik alanlardan kaçının — sınanması zor, gizli bir küresel durum oluştururlar
  • Sabitler için arayüz yerine örneklenemeyen bir sınıfı (özel kuruculu) kullanın

Sıkça Sorulan Sorular

“Statik Alanlar ve Sabitler” dersi ücretsiz mi?

Evet — “Statik Alanlar ve Sabitler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Statik Alanlar ve Sabitler” dersinde ne öğreneceğim?

Paylaşılan durum için statik alanları, static final ile sabitleri ve statik başlatıcıları kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Statik Alanlar ve Sabitler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Yöntem Aşırı Yükleme Kuralları
  2. Değişken Sayıda Parametre
  3. Statik Alanlar ve Sabitler
  4. Yardımcı Sınıflar ve Statik Fabrika Yöntemleri
← Java Academy Sayfasına Dön