Bir kaç gündür aklımı kurcalayan bir soru var. Şöyleki: Yeni bir sınıf oluşturduktan sonra sınıfta kullanacağım bazı değişkenleri oluşturuyorum. Peki bunları nerede tanımlasam daha güzel bir tasarım olur? Mesela Deneme isimli bir sınıfımız olsun ve bu sınıfımızın bir kurucu fonksiyonu olsun. Bu sınfta bir Paint nesnesi tanımlamak istiyorum. Aşağıdaki hangi yöntem daha verimlidir? Farkları nelerdir?

1--

 public class Deneme
{
    private Paint paint;

    public Deneme() 
    {
          paint=new Paint();
    }
}

2--

 public class Deneme
{
    private Paint paint=new Paint();

    public Deneme() 
    {
    }
}

soruldu: 21 Haz '13, 01:27

ekremk's gravatar image

ekremk
421243436
cevap kabul oranı: 7%


Bana göre en iyisi:

public class Deneme
{
    private Paint _paint;

    public Deneme() 
    {
        // default constructor
    }

    public Deneme(Paint paint) 
    {
        _paint = paint;
    }
}

Veya getter/setter metodları ile yapmak. Normalde javayı bilmiyorum ama, C# ta çoğu zaman yapıcı metoda ihtiyaç yoktur...

permanent link

cevaplandı: 21 Haz '13, 01:52

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288
cevap kabul oranı: 44%

2

ufak bir hatırlatma. java isimlendirme geleneğinde alt çizgi yoktur. o php'den kalma bir alışkanlıktır.

(22 Haz '13, 01:20) kodmanyagha kodmanyagha's gravatar image

ikinci senaryondaki paint instance'ın birinci senaryoya göre daha önce yaratılır. Bu örneğinde ikisi arasında pek fark yok çünkü ikisinin de yaratılma zamanları çok yakın ve scope'ları aynı. Ama değişkeninin tanımı static olsaydı çok şey değişirdi :)

permanent link

cevaplandı: 21 Haz '13, 08:45

MCY's gravatar image

MCY
1.1k2622
cevap kabul oranı: 16%

Ama değişkeninin tanımı static olsaydı çok şey değişirdi :) bunu biraz açsanız.

(21 Haz '13, 08:47) ekremk ekremk's gravatar image

static olunca constructora gerek kalmadan doğrudan Deneme._paint şeklinde erişebilirdiniz. tabiki erişim belirleyicisi public olmak şartıyla. Static olan şeyler uygulama jvm'e yüklenince hafızada oluşturulurlar diye biliyorum.

(22 Haz '13, 01:18) kodmanyagha kodmanyagha's gravatar image

iki kod örneğinde de paint nesnesinin tanımladığı ve değerinin atandığı noktalara break point koyup debug ederseniz durumu daha net ve kalıcı olarak görebilirsiniz sanırım :]

(22 Haz '13, 07:59) gturedi gturedi's gravatar image

en güzeli kod ile açıklamak :)

public class Clazz1 { 
   public static String asd;

   public Clazz1() {
       asd = "asd";
   }
}

public class Test { 
   public static void main(String[] args) { System.out.println(Clazz1.asd);
       Clazz1 cls = new Clazz1();
       System.out.println(Clazz1.asd);
   }
}

SONUC : null asd

yani senin 2. senaryondaki gibi tanımlasaydım null değeri görmezdim.

permanent link

cevaplandı: 24 Haz '13, 00:56

MCY's gravatar image

MCY
1.1k2622
cevap kabul oranı: 16%

Sorunun tam bir cevabını bulmak için Javada değişkenlerin kapsamlarına bakmak gerekir. Javada 4 tip değişken kapmsamı bulunur.

  • Static Kapsam : Javada en uzun kapsam statictir. Sınıflar Class Loader tarafından yüklendiği andan itibaren JVM içerisinde bulunur. Ilk olarak static değişkenlerin değerleri atanır.
  • Sınıf değişkenleri (instance variable) : İkinci en uzun kapsamlı değişkenlerdir. Sınıflar oluşturulduğu anda bellekte yer kaplamaya başlarlar.
  • Lokal değişkenler : Bir methodun çalışma süresince varolan değişkenlerdir.
  • Block değişkenler : Bir block süresince var olan değişkenlerdir.

    class Layout { // class
    static int s = 343; // static variable

    int x; // instance variable
    
    { x = 7; int x2 = 5; } // initialization block    
    Layout() { x += 8; int x3 = 6;} // constructor
    
    void doStuff() { // method
    
    int y = 0; // local variable
    
    for(int z = 0; z < 4; z++) { // 'for' code block
    
    y += z + x;    
    }    
    }    
    }
    

Yukarıdaki örnekte bürün değişken tipleri gösteriliyor. Bu sınıf için static olan s değişkeni ilk, x ve x2 değişkenleri ikinci olmak üzere sırasıyla lokal ve block değişkenleri yüklenir.

Bu doğrultuda soruna cevap verecek olursak. sorunda belirttiğin iki yöndem de sınıf değişkenleri kapsamında değerlendirilir. Verdiğin örnekte iki seçenek arasında bu kullanım için hiçbir fark yoktur.

permanent link

cevaplandı: 24 Haz '13, 04:59

erencan's gravatar image

erencan
7911812
cevap kabul oranı: 40%

değiştirildi: 24 Haz '13, 05:01

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:

×14

Soruldu: 21 Haz '13, 01:27

Görüntüleme: 1,023 kez

Son güncelleme: 24 Haz '13, 05:01

powered by BitNami OSQA