Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi
0 oy
25 gösterim
Bir objeyi klonlamak nedir? Nasıl olur?
Genel Kavramlar kategorisinde (3.4k puan) sordu

1 cevap

0 oy

Nesne yönelimli bir programlama dilinde (java/php/c#) hafızada yeni bir nesne örneği yarattığımız zaman bunu bir değişkene atıyoruz. Mesela ArrayList al = new ArrayList().  Daha sonra bu yaratılan örneğin bir kopyasını oluşturmak istediğimiz zaman ArrayList list = al gibi bir yöntemle ilerlersek hata yapmış oluruz. Çünkü bu tarz bir atamayla hafızada zaten olan al ile gösterilen nesne örneği ayrıca list ile gösterilmeye başlanmış olur. Tabi bu ilkel (primitive) tipler için geçerli değil. Yani int tipinde bir değişken olursa değeri kopyalanmış olur.

Peki bir objeden bir tane daha istediğimizde ne yapmalıyız?

Bunu için java'da clonable diye bir interface var. Bunu interface gerçekleştirilirse standard isimlendirme olarak clone metodu kullanılacaktır. Aşağıdaki örneğimize bir göz atalım

package com.hasscript.ornekler.clonable;

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

/**
 * http://hasscript.com/1456/obje-klonlama-nedir orneği
 *
 */
public class OrnekClone {

    static class Ulke implements Cloneable {
        List<String> sehirler = new ArrayList<>();
        String adi;
        int nufus;
        
        @Override
        public String toString() {
            return "Ulke [sehirler=" + sehirler + ", adi=" + adi + ", nufus=" + nufus + "]";
        }
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Ulke u = new Ulke();
            u.adi = this.adi;
            u.nufus = this.nufus;
            u.sehirler.addAll(this.sehirler);
            return u;
        }
        
    }

    public static void main(String[] args) {
        Ulke ulke1 = new Ulke();
        ulke1.adi = "Türkiye";
        ulke1.nufus = 75000000;
        ulke1.sehirler.add("Tokat");
        ulke1.sehirler.add("Ankara");
        ulke1.sehirler.add("Istanbul");
        
        System.out.println("Ulke 1 :" + ulke1);
        
        Ulke ulke2 = new Ulke();
        ulke2.adi = "Fransa";
        ulke2.nufus = 60000000;
        ulke2.sehirler.add("Nice");
        ulke2.sehirler.add("Marsellie");
        ulke2.sehirler.add("Paris");
        
        System.out.println("Ulke 2 :" + ulke2);
        
        
        Ulke ulke3 = ulke1;
        
        System.out.println("Ulke1 Ulke3'e atandı / ulke3 :" + ulke3);
        
        ulke3.adi = "Italya";
        System.out.println("Ulke3 adı italya oldu / Ulke 1 :" + ulke1); // 3 değiştirildi ama bir ekrana basılıyor
        
        Ulke ulke4 = null;
        try {
            ulke4 = (Ulke) ulke2.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        ulke4.adi = "Danimarka";
        ulke4.nufus = 100;
        
        System.out.println("Ulke 4 :" + ulke4);
        
    }
}

Sonuc

Kod için

https://github.com/commandito/hasscript.com/blob/master/ornekler/src/main/java/com/hasscript/ornekler/clonable/OrnekClone.java

(3.4k puan) cevapladı

İlgili sorular

0 oy
2 cevap 65 gösterim
65 gösterim 2 Aralık 2016 Java kategorisinde kenan (3.4k puan) sordu
0 oy
1 cevap 82 gösterim
82 gösterim 2 Aralık 2016 Java kategorisinde kenan (3.4k puan) sordu
0 oy
1 cevap 24 gösterim
+1 oy
1 cevap 17 gösterim
0 oy
0 cevap 33 gösterim
33 gösterim 11 Temmuz Genel Kavramlar kategorisinde tolgacelik.art (1.7k puan) sordu
...