4 Temmuz 2015 Cumartesi

Static Anahtar Kelimesi

        Sınıfların içinde bulunan değişkenler her yeni nesne için tekrar tekrar oluşturulur . Buna nesne değişkeni denir . Fakat bazı durumlarda nesneler için değil de sınıf için genel değişkenler tanımlanması gerekir ki bu da static anahtar kelimesi ile mümkündür . Daha açık anlatmak gerekirse ;

Aşağıdaki gibi bir nesne sınıfınız varsa ve sürekli instance alarak yeni nesne üretiyorsanız ve her nesne için id numarasının bir artmasını istiyorsanız bunun için id değerini static yapmanız gerekiyor . Çünkü oluşturulan her nesne için ayrı bir id değişkeni oluşturmak yerine o sınıfa ait bir değişken oluşturulmuştur .


public final class Nesne {

 public static  int id = 0;
 
 public Nesne() {
  id++;
 }
 
}
public class Main {

 public static void main(String[] args) {

  Nesne nesne1 = new Nesne();
  System.out.println(nesne1.id);
  
  Nesne nesne2 = new Nesne();
  System.out.println(nesne2.id);
  
  
 }
}
Sonuç : 1
        2

Static kullanılmasaydı her seferinde değer 0 dan başlayacak ve 1 olacaktı -yani sürekli başa saracaktı-. Ek olarak bu nesne değişkenine direk "Nesne.id" ile de ulaşabilirsiniz . Herhangi bir instance almaya gerek duymadan .



public class Main {

 public static void main(String[] args) {

  Nesne nesne1 = new Nesne();
  System.out.println(nesne1.id);
  
  Nesne nesne2 = new Nesne();
  System.out.println(nesne2.id);
  
  Nesne.id = 10;
  System.out.println(nesne2.id);
 }
}
Sonuç : 1
        2
        10

Static methodlarda aynı şekilde instance almadan direk sınıfı adı üzerinden ulaşılabilir kullanım açısından static değişkenle arasında bir fark bulunmaz -nesneden bağımsız method oluşturmak -. Tek dikkat edilmesi gereken static methodlar içinde de static değişkenler kullanılması gerekmektedir .

Farklı bir static anahtar kelimesi kullanımı ise "static kod bloklarıdır" . Genellikle oluşturulan static değişkenlere ilk değerlerini atamak için kullanılırlar ve bu static blokları  nesne oluşturulmadan hemen önce çalışır .

public final class Nesne {

 public static int id = 0;
 
 public Nesne() {
  System.out.println("constructor");
  id++;
 }
 
 static
 {
  System.out.println("static blok");
  id=10;
 }
}
public class Main {

 public static void main(String[] args) {

  System.out.println("main");
  
  Nesne nesne1 = new Nesne();
  System.out.println(nesne1.id);
  
  Nesne nesne2 = new Nesne();
  System.out.println(nesne2.id);
  
  Nesne.id = 10;
  System.out.println(nesne2.id);
 }
}
Sonuç : main
static blok
constructor
11
constructor
12
10
Kısacası bir sınıf için genel bir değişken oluşturulmak istendiğinde static anahtar kelimesi kullanılmalıdır . Son olarak bir statik sınıftan sadece static değer ve methodlara erişilebilir . Aksi halde instance alınması gerekmektedir .

Dipnot : public static void main() in static olmasının nedeni kodun JVM e ilk yüklenme anında ortada herhangi bir nesne olmaması ve nesne yaratmadan methodun kullanılmasının tek yolunun static olarak tanımlanmasıdır .

5 Mart 2015 Perşembe

The connection to adb is down, and a severe error has occured

       

 "The connection to adb is down, and a severe error has occured" hatası , nedenini hala anlayamadım ama çözümü gayet basit :)

1) Eclipse , genymotion ya da alakalı ne varsa kapatın .

2) "\adt-bundle-windows-x86_64-20140321\sdk\platform-tools" adresine gidin ve shift tuşuna basılı tutarak sağ tıklayın "Open comman window here " veya "command prompt u burada aç" tarzı sekme görüceksiniz tıklayın .

3) "adb kill-server" yazın enter a basın ardından "adb start-server" yazıp enter a basın

4) Tekrar eclipse veya ne kullanıyorsanız açıp kaldığınız yerden devam edebilirsiniz .

Observer Design Pattern

          Observer design pattern , türkçe karşılığı gözlemci tasarım kalıbı olup temelinde de gözlemcilerin hepsini tek bir komutla haberdar etme , işlem yaptırma veya harekete geçirme gibi işlemler için kullanılır . Yani elimizde bir nesne olduğunu düşünelim , bu nesne değiştiğinde gereken diğer tüm sınıf ya da methodlara haber verilir . Yani bu nesneyle ilgilenen sınıflar sürekli nesne değişti mi sormaktansa -thread başlatıp nesnenin değişimi gözlemlenebilir - , nesne değiştiğinde tüm sınıflara haber vermek için oluşturulan bir ara sınıf daha mantıklı bir çözüm gibi duruyor .

           Aşağıdaki örnekte daha iyi anlaşılması için tüm operatörlere mesaj atan bir program yapılmıştır . Kodda sadece bir satırlık kodla her sınıf için tek tek yazılması gereken kod yazılması sağlanmıştır .-3 farklı operatöre ayrı ayrı mesaj atmaktansa tek bir satırla 3 operatöre mesaj atmak-

package com.gurk.designpatterns;

import java.util.ArrayList;
import java.util.List;

public class Islem {

 private List list = new ArrayList<>();
 private String message;

 public void observerEkle(Observer observer) {
  list.add(observer);
 }

 public void tumKullanicilaraGonder() {
  for (Observer observer : list) {
   observer.mesajGonder();
  }
 }

 public String getMessage() {
  return message;
 }

 public void setMessage(String message) {
  this.message = message;
  tumKullanicilaraGonder();
 }

}
package com.gurk.designpatterns;

public abstract class Observer {

 /** 
  * alttaki sınıflar kullanacak diye bir tane Islem tanımla 
  */
 
 protected Islem islem;

 public abstract void mesajGonder();

}
package com.gurk.designpatterns;

public class Avea extends Observer {

 public Avea(Islem islem) {
  // this.islem = observer sınıfının parametresi
  this.islem = islem;
  this.islem.observerEkle(this);
 }

 @Override
 public void mesajGonder() {
  System.out.println(islem.getMessage()+" AVEA lı");

 }

}
package com.gurk.designpatterns;

public class Turkcell extends Observer{
 
 
 public Turkcell(Islem islem) {
  
  this.islem=islem;
  this.islem.observerEkle(this);
 }
 
 @Override
 public void mesajGonder() {
  System.out.println(islem.getMessage()+" TURKCELL li");
  
 }

}
package com.gurk.designpatterns;

public class Vodafone extends Observer {

 public Vodafone(Islem islem) {
  this.islem = islem;
  this.islem.observerEkle(this);
 }

 @Override
 public void mesajGonder() {

  System.out.println(islem.getMessage() + " VODAFONE lu");
 }

}
package com.gurk.designpatterns;

public class Test {

 public static void main(String[] args) {
  
  Islem islemler = new Islem();
  
  new Turkcell(islemler);
  new Avea(islemler);
  new Vodafone(islemler);
  
  islemler.setMessage("Merhaba");
  
 }
 
}
Sonuç

Merhaba TURKCELL li
Merhaba AVEA lı
Merhaba VODAFONE lu


          Kısaca kodu açıklamak gerekirse aynı işlemi gerçekleştirecek olan tüm sınıflar observer sınıfı altında toplanmıştır .  islemler.setMessage("STR"); komutu çağırılığında ise listte tutulan tüm observerler tetiklenip ortak olan methodların çağrılması sağlanmıştır .