Sponsor Reklam 


14.10.2008 (04:15)

 Klonlama için clone() metodu ve Cloneable Sınıfı 
Kullanmakta olduğumuz bir nesnenin bir kopyasını (klonunu) üretmek ve onu işlemlerimiz için kullanmak isteyebiliriz. Bu noktada eğer aynı sınıftan bir nesne tanımlayıp referans ataması yaparsak, nesne üzerinde yapacağımız işlemler diğer nesneyi etkileyecektir.

// TextBox nesneleri olusturalim
TextBox tbox = new TextBox();
TextBox tbox2 = tbox;
tbox.setWidth(100);
tbox2.setWidth(200);
System.out.println(tbox.getWidth());
System.out.println(tbox2.getWidth());

Buradaki çıktı
200
200
olacaktır. tbox2'de yapılan işlem tbox1'i etkilemiştir. Bunu önlemek için klonlama (clone) yapılmalıdır.

Kullanımı için şu sınıflara bakalım:

Main.java
package kodcu.net;

public class Main {
 
  public static void main(String[] args) {
   
    // Image tipinde img1 ve img2 tanimlanir
    Image img1 = new Image(32, 32, 255);
    Image img2;
    // img1 klonlanir
    img2 = (Image) img1.clone();
    // img1'in genisliginde bir degisiklik yapilir
    img1.setWidth(22);
    // img1'in pikselleri 1 ile doldurulur
    img1.fillWithOnes();
    // img1 ve img2'nin genislikleri ve yukseklikleri yazdirilir
    System.out.println(img1.getWidth());
    System.out.println(img2.getWidth());
    System.out.println(img1.getHeight());
    System.out.println(img2.getHeight());
    // img1 ve img2'nin (10,10) pikselindeki deger yazdirilir
    System.out.println(img1.valueAt(10, 10));
    System.out.println(img2.valueAt(10, 10));
   
  }
 
}

Image.java
package kodcu.net;

public class Image implements Cloneable {
 
  private int width;
  private int height;
  private int depth;
  private int[][] pixels;
 
  //constructor
  public Image(int width, int height, int depth) {
    this.width = width;
    this.height = height;
    this.depth = depth;
    this.pixels = new int[width][height];
  }
 
  /**
  * Genisligi verir
  * @return int
  */

  public int getWidth() {
    return width;
  }
 
  /**
  * Yuksekligi verir
  * @return int
  */

  public int getHeight() {
    return height;
  }
 
  /**
  * Renk seviyesini verir
  * @return int
  */

  public int getDepth() {
    return depth;
  }
 
  /**
  * Genisligi ayarlar
  * @param w int
  */

  public void setWidth(int w) {
    width = w;
  }
 
  /**
  * Yuksekligi ayarlar
  * @param h int
  */

  public void setHeight(int h) {
    height = h;
  }
 
  /**
  * Renk seviyesini ayarlar
  * @param d int
  */

  public void setDepth(int d) {
    depth = d;
  }
 
  /**
  * Piksel matrisini 1 ile doldurur
  */

  public void fillWithOnes() {
    for (int i = 0; i < width; i++)
      for (int j = 0; j < height; j++)
        pixels[i][j] = 1;
  }
 
  /**
  * Piksel matrisinde verilen satir ve sutuna karsilik gelen yerdeki
  * degeri verir
  * @param row int
  * @param col int
  * @return int
  */

  public int valueAt(int row, int col) {
    int result;
    try {
      result = pixels[row][col];
    } catch (ArrayIndexOutOfBoundsException e) {
      result = -1;
      System.out.println("Error: Array Index Fault");
    }
    return result;
  }
 
  /**
  * Gecerli nesnenin bir kopyasini verir
  * @return Object
  */

  public Object clone() {
    try {
      return super.clone();
    }
    catch (CloneNotSupportedException ex) {
      return null;
    }
  }

}

Programın çıktısı şudur:
22
32
32
32
1
1

Resimlerdeki genişlik değişimi görülmektedir. Yani birinde yapılan değişiklik diğerini etkilememiştir. Resim yüksekliklerine müdahale yapılmadığı için ikisi de 32'de kalmıştır. Dikkati çeken ise (10, 10) piksel noktasının değerinin her ikisinde de 1 olmasıdır. Oysa sadece img1 nesnesinde 1'lerle doldurma işlemi yapılmıştır (fillWithOnes() metodu ile). Bunun sebebi pixels'in bir işaretçi (referans veren) değişken olmasındandır. img2'deki pixels değişkeni ile aynı yeri işaret etmektedir ve bu nedenle [10][10] gözleri aynı yere ulaşmaktadır.

Üzerinde değineceğimiz bir başka konu da Image sınıfının Cloneable arayüzünü gerçekliyor olmasıdır. Bu sayede o sınıfın nesnelerinin klonlanması yapılabilmektedir. clone() metodunun dönüş tipi Object olduğu için neyi klonluyor isek o sınıfa cast yapılmalıdır.

img2 = (Image) img1.clone();

Örnekte de bu şekilde cast işlemini görmekteyiz.
Imza: admin








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter