Anıl Şenocak Anıl Şenocak
Yazılım Mühendisi
Cover image
2026-07-11 0 toplam yorum
Private Static Final Alanlar Nasıl Değiştirilir

Genel olarak, static, "türün bir örneği yerine türün kendisiyle ilişkili" anlamına gelir.

Bu, türün bir örneğini oluşturmadan statik bir değişkene sahip olabileceğimiz anlamına gelir ve değişkene erişen herhangi bir kod, tam olarak aynı verilere erişir. Örnek:

Test x = new Test();
Test y = new Test();
x.sinifDegiskeni = 10;
y.sinifDegiskeni = 20;
System.out.println(x.sinifDegiskeni);

Konsola 10 yazar: y.sinifDegiskeni ve x.sinifDegiskeni ayrıdır, çünkü x ve y farklı nesneleri referans eder. Statik üyelere referanslar aracılığıyla başvurabilirsiniz, ancak bunu yapmak kötü bir fikirdir. Yapsaydık:

Test x = new Test();
Test y = new Test();
x.statikDegisken = 10;
y.statikDegisken = 20;
System.out.println(x.statikDegisken);

o zaman 20 yazar. Her instance için sabit olan sadece bir değişken vardır. Bunu şu şekilde yazmak daha net olurdu:

Test x = new Test();
Test y = new Test();
Test.statikDegisken = 10;
Test.statikDegisken = 20;
System.out.println(Test.statikDegisken);

Bu, davranışı çok daha belirgin hale getirir. Modern IDE'ler genellikle ikinci örneğin üçüncüye dönüştürülmesini önerir.

Değeri aşağıdaki gibi tanımlanan bir satır içi bildirime sahip olmak için hiçbir neden yoktur, çünkü her örneğin kendi NUMARASI olacaktır, ancak her zaman aynı değere sahip olacaktır (değişmezdir ve bir değişmez değerle başlatılır). Bu, tüm örnekler için yalnızca bir final static değişkene sahip olmakla aynıdır.

private final int NUMBER = 10; Bu nedenle değişemiyorsa, her örnekte bir instance olmasının bir anlamı yoktur. Ancak, bunun gibi bir constructor'da setlenirse daha anlamlıdır:

// Tanımlandığında setlenmek zorunda değiliz
private final int cevap;

public Bilgi(int cvp) {
   // Yapıcı metod ile değer atanabilir ancak daha sonra değiştirilemez.
   cevap = cvp;
}

Şimdi, Bilgi class'ının her örneği için farklı ancak değişmez bir sayı değerine sahip olabiliriz.

Java 5'te enum'lar mevcut olana kadar, static final, sabitleri tanımlamanın genel yoluydu.

public class Bilgi {
    private static final Integer CEVAP = 42;

    public String soruSor(String soru) {
        return "Sorulan soru:" + soru + ", cevap: " + CEVAP;
    }
}

Şimdi cevabı test amaçlı değiştirmek istiyoruz:

public class BilgiTest {
    @Test
    public void testSoruSor() throws Exception {
        Bilgi bilgi = new Bilgi();

        String cevap = bilgi.soruSor("örnek soru?");
        assertThat(cevap, is("Sorulan soru:örnek soru?, cevap: 42"));

        setFinalStaticField(Bilgi.class, "CEVAP", 41);

        cevap = knowledge.askQuestion("örnek soru?");
        assertThat(cevap, is("Sorulan soru:örnek soru?, cevap: 41"));
    }

    private static void setFinalStaticField(Class<?> clazz, String fieldName, Object value)
            throws ReflectiveOperationException {

        Field field = clazz.getDeclaredField(fieldName);
        field.setAccessible(true);

        Field modifiers = Field.class.getDeclaredField("modifiers");
        modifiers.setAccessible(true);
        modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);

        field.set(null, value);
    }
}

Alanı erişilebilir hale getirip final kaldırarak bunu mümkün kılıyoruz. Daha sonra alanı reflection kullanılarak editlenebilir.

static initialization block
{
    // Bişeyler bişeyler...
}

Sınıfın bir örneği her oluşturulduğunda çağrılır. static block, sınıfın kendisi başlatıldığında, bu türden kaç tane nesne oluşturursanız oluşturun, yalnızca bir kez çağrılır.

public class Test {

    static{
        System.out.println("Static");
    }

    {
        System.out.println("static olmayan block");
    }

    public static void main(String[] args) {
        Test t = new Test();
        Test t2 = new Test();
    }
}
Static
static olmayan block
static olmayan block
Yorumlar
Henüz yorum yok. İlk yorumu sen yaz.
Yorum Bırak
Adınız (isteğe bağlı)
Yorumunuzu yazın...
0/500