Java Derin ve Sığ Kopyalama (Deep and Shallow Copy)

Merhaba, bu yazıda javada bir objenin kopyalanmasını inceleyeceğiz. Bir obje “hangi şekillerde kopyalanır” ve “doğru kopyalama yöntemi nasıldır” konularını ele alacağız. Java da oluşturulan bir objenin hafızada(Ram) nasıl tutulduğundan başlayalım. Hepimizin bildiği gibi javada bir objenin oluşabilmesi için “new” anahtar kelimesinin kullanılması gereklidir. Bu anahtar kelime belirtilen türde bir obje oluşturacak ve hafızadaki yerini ayıracaktır.

  1. SIĞ KOPYALAMA (SHALLOW COPY)

Aşağıdaki gibi bir “Bitki” sınıfımız olsun:

Main metod içerisinde bu sınıfı oluşturalım:

Yukarıda görüldüğü üzere “new” ile yeni bir Bitki objesi üretmiş olduk ve program çalıştırıldığında Ram üzerinde b1 objesi için bir yer ayrılacak. 

b1 objesinin hafızadaki yeri artık belli, şimdi yeni bir Bitki tanımlayalım fakat “new” anahtar kelimesi ile bu tanım için bir hafızada bir yer ayırmayalım. 

Tanımladığımız b2 objesine daha önce hafızada yerini oluşturduğumuz b1 objesini atayalım. Bu atama sonucunda artık b2 objesi de hafızada b1 objesinin baktığı yere bakacaktır. Dolayısıyla bunun anlamı, aslında yeni bir obje üretilmediğidir. Sadece b1 in yeni bir kopyası oluşturulmuştur. 

Peki bu durumda b1 de yapılan bir değişiklik, b2’yi etkileyecek mi?

Örneğin b1 in rengini maviden kırmızıya değiştirelim ve her iki bitkinin de renklerini ekrana yazdıralım. 

Ekran Çıktısı:

Çıktıda görüldüğü gibi b1’in değiştirdiğimiz her hangi özelliği b2’de de değişmiş olarak karşımıza çıkmakta. Bunun sebebi yukarıda bahsettiğimiz üzere aslında yeni bir objenin oluşturulmamış olması ve bu iki objenin de hafıza da aynı yeri göstermesidir. Dolayısıyla sadece b2’de yapılacak değişiklikler de b1’e yansıyacaktır.

Görsel olarak ifade etmek gerekirse;

Bu şekilde objelerin kopyalanmasına SIĞ (SHALLOW) KOPYALAMA denir. 

  1.  DERİN KOPYALAMA (DEEP COPY)

Peki halihazırda kullandığım bir objeyi tüm özellikleri ile kopyalayıp hafızada yeni bir obje oluşturmak istersem ne yapmalıyım? Yani kopyaladığım bu objenin diğer obje ile hiçbir bağımlılığı olmamalı ve özelliklerini istediğim gibi değiştirebilmeliyim. Bunun için derin kopyalama kullanacağız. Temel olarak bunu gerçekleştirmenin 2 yolu bulunmaktadır. 

  1. Birinci yöntem tüm işlemleri kendimiz gerçekleştiririz:

Bitki sınıfına bir kopyala metodu ekleyelim. Bu metod içerisinde, parametre olarak aldığımız ve kopyalayacağımız orjinal objenin tüm özelliklerini kopyalayıp yeni bir obje oluşturalım.

Bu metod içerisinde bitkinin tüm özelliklerini teker teker yeni bitkiye atamalıyız. Örneğimizde sadece tek bir özellik olduğu için sadece renk özelliğini kopyaladık. Şimdi bu metodu kullanarak 2. bir bitki oluşturalım ve orjinal bitkinin rengini değiştirdiğimizde yeni bitkinin rengi değişecek mi kontrol edelim:

Ekran çıktısı:

Görüldüğü gibi artık her iki bitki de hafızada farklı yerleri gösterdiği için yapılan değişiklik sadece değişikliğin yapıldığı objeyi etkiledi. Görsel olarak ifade etmek gerekirse:

  1.  İkinci yöntem olarak da Cloneable arayüzünü kullanabiliriz:

Java’da tüm objeler aslında Object sınıfından türetildiği için bu sınıfın tüm özelliklerini de kalıtırlar. Yani Object sınıfının metotları ve özelliklerini kullanabiliriz. Bu metodlardan bir tanesi de clone() metodudur.

Bu metodu kullanabilmek için de sınıfımızın Cloneable arayüzünü gerçeklemesi gerekmektedir.(implement etmesi gerekmektedir.)

Yukarıdaki kodda görüldüğü üzere clone() metodu ile derin kopyalama işlemi gerçekleştirildi. Burada dikkat edilmesi gereken 2 konu vardır; birincisi Cloneable arayüzünün implements edilmesi gerekmektedir ve clone () metodu protected olduğu için implement edildiği class içerisinde kullanılabilir. İkinci konu ise clone metodu CloneNotSupportedException fırlatır. Bu exception’ın düzgün bir şekilde yönetilmesi gerekir. Biz şimdilik örnekte fırlatarak devam ettik. 

Yukarıda örneklerle beraber Java’da Obje kopyalama konusundan bahsettik. Sonraki yazılarda görüşmek üzere. İyi çalışmalar. 

Leave a Reply

Your email address will not be published. Required fields are marked *