Merhaba arkadaşlar. Static sınıflar nerede ve nasıl kullanmalıyız? Mesela ben şimdiye kadar hiç static bir class kullanma ihtiyacı duymadım. Bildiğim kadarıyla C#' da static class kullanımı yok. Kullanım alanlarına birkaç örnek verirseniz çok iyi olur. Teşekkürler.

soruldu: 04 Tem '12, 11:34

querman's gravatar image

querman
391162028
cevap kabul oranı: 0%

değiştirildi: 05 Tem '12, 02:55

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Static classlar ve class üyeleri (değişkenler, metodlar), o sınıfın bir instance'ını oluşturmadan erişilebilir olmaları için kullanılabilir.

Örneğin uygulamanızın birçok yerinde kullanabileceğiniz bir metodunuz var ve bunu kod tekrarı yapmadan, sadece bir yerde yazıp her yerde kullanmak istiyorsunuz. (Herhangi bir extend ya da implement kullanmadan)

Bu durumda bir Util classınızın içine static bir metod tanımlayıp, ihtiyaç duyduğunuz her yerde UtilClassiniz.staticMetodunuz(paramtreleriniz); şeklinde kullanabilirsiniz.

Bu durumda Util classınızdan new ile yeni bir instance oluşturmaya da gerek kalmadığını farketmişsinizdir.

Ayrıca C#'ta da Java'da olduğu gibi static class, metod ve değişkenler bulunabilir. Ayrıntılı bilgi için Static Classes and Static Class Members.

Edit:

Java'da inner classlar 2 çeşittir: static ve non-static. non-static olan inner classlar, üst classın üyeleri private bile tanımlanmış olsa onlara erişebilirler fakat static olanlar üst classın üyelerine erişemezler. Eğer static inner class kullanırsanız, bunun dışarıya erişemeyeceğini de garanti etmiş olursunuz.

Örneğin aşağıdaki classı ele alalım:

public class Outer {
    private int a;

    protected int foo () {
        return 0;
    }

    private int foo2 () {
        return 0;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    class NonStaticInner {
        int x = a;
        int y = getA();
        int z = foo();
        int t = foo2();
    }

    static class StaticInner {

    }
}

Dış classta tanımladığımız public, protected ve private alanlara ve metodlara non-static inner classtan erişebiliyoruz fakat static inner classtan erişemiyoruz. Onu da şu görselle anlamaya çalışalım:

static & non-static inner classes in java

CTRL + SPACE'den sonra gelen üyeler sadece Object içinden geliyor, üst classımızdan gelmiyor. Belki böyle bir kısıtlama yapmak isteyebilirsiniz.

Ayrıca Oracle'ın sitesinde güzel bir döküman var konu hakkında: Nested Classes.

C#'daki inner classlar da Java'daki static nested classlar gibidir. Bunun için de şöyle bir açıklama bulabilirsiniz: All C# nested classes are like Java static nested classes

permanent link

cevaplandı: 04 Tem '12, 12:49

OguzOzkeroglu's gravatar image

OguzOzkeroglu
2.5k32939
cevap kabul oranı: 40%

değiştirildi: 05 Tem '12, 03:50

C#' da static class kullanımı var ancak tüm metodları static olan sınıflar static class olarak kullanılabiliyor ve Java' da olduğu gibi inner class olamıyorlar diye hatırlıyorum. Static metod ve değişkenlerde dediklerine katılıyorum ancak static class olayını hala anlayabilmiş değilim.

(04 Tem '12, 14:53) querman querman's gravatar image

Static classlar için cevabıma ekleme yaptım.

(05 Tem '12, 05:05) OguzOzkeroglu OguzOzkeroglu's gravatar image

Bir sinifin yaratilmasi sirasinda parametrelerin kullanilmasi yonunde esneklik saglamak icin inner static sinif kullanilabilir.

Ornegin: SpecialClass sinifi x,y,z yada hic parametere almadan tek seferde yaratilmak istensin;

SpecialClass classNoParameter = new SpecialClass.Builder().build();
SpecialClass classWithParameterX = new SpecialClass.Builder().setX(3).build();
SpecialClass classWithParameterXY = new SpecialClass.Builder().setX(3).setY(1).build();
SpecialClass classWithParameterXYZ = new SpecialClass.Builder().setX(3).setY(1).setZ(4).build();

Bu durumda Builder static sinifi SpecialClass sinifi daha yaratilmadan kullanilabilir;

public class SpecialClass {
private int x,y,z;

private SpecialClass() {}

public static class Builder {
    private static final int DEFAULT_VALUE_X=0
                    ,DEFAULT_VALUE_Y=0
                    ,DEFAULT_VALUE_Z=0
                    ;
    private int x,y,z;

    public Builder() {
        Builder.this.x = DEFAULT_VALUE_X;
        Builder.this.y = DEFAULT_VALUE_Y;
        Builder.this.z = DEFAULT_VALUE_Z;
    }

    public Builder setX(int x) {
        Builder.this.x = x;
        return Builder.this;
    }

    public Builder setY(int y) {
        Builder.this.y = y;
        return Builder.this;
    }

    public Builder setZ(int z) {
        Builder.this.z = z;
        return Builder.this;
    }

    public SpecialClass build() {
        SpecialClass retval = new SpecialClass();
        retval.setX(Builder.this.x);
        retval.setY(Builder.this.y);
        retval.setZ(Builder.this.z);
        return retval;
    }
}
// TODO: Getter Setter methodlar.

}

permanent link

cevaplandı: 05 Tem '12, 08:06

bsceran's gravatar image

bsceran
162
cevap kabul oranı: 0%

değiştirildi: 05 Tem '12, 08:12

statik sınıflar ve singleton pattern gerekli olmadıkça kullanmamakta fayda var, çünkü bunların sıklıkla kullanımı bir süre sonra tasarımınızı oop olmaktan çıkarıp procedurel bir tasarıma yaklaştırmakta.

permanent link

cevaplandı: 05 Tem '12, 06:50

nht's gravatar image

nht
95651720
cevap kabul oranı: 33%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,077

Soruldu: 04 Tem '12, 11:34

Görüntüleme: 2,211 kez

Son güncelleme: 22 Şub '13, 09:38

powered by BitNami OSQA