Menu
Coddy logo textTech

clone() Metodu

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 43 / 87.

clone() yöntemi bir nesnenin kopyasını oluşturur. Bunu kullanmak için sınıfınızın Cloneable arayüzünü uygulaması ve Object sınıfındaki clone() yöntemini geçersiz kılması (override etmesi) gerekir.

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

Artık nesnelerin bağımsız kopyalarını oluşturabilirsiniz:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy, aynı değerlere sahip ayrı bir nesnedir

Varsayılan olarak, clone() bir yüzeysel kopya gerçekleştirir; yani ilkel değerleri ve referansları kopyalar. Eğer nesneniz alan olarak başka nesneler içeriyorsa, hem orijinal hem de kopya aynı iç içe geçmiş nesnelere referans verecektir. İç içe geçmiş nesnelerle gerçekten bağımsız kopyalar oluşturmak için, bu iç içe geçmiş nesneleri de clone() metodunuzun içinde kopyalayarak bir derin kopya uygulamanız gerekir.

challenge icon

Görev

Kolay

Nesne kopyalamayı (cloning) gösteren bir belge yönetim sistemi oluşturalım. Orijinal belgeyi bozmadan kullanıcıların belgeleri çoğaltmasına olanak tanıyan, bağımsız kopyalar oluşturmak için kopyalanabilen bir Document sınıfı oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Document.java: Kopyalamayı destekleyen bir belgeyi temsil eden bir sınıf oluşturun. Bir Document sınıfının üç özel (private) alanı vardır: title (String), author (String) ve version (int). Tüm alanları başlatan bir yapıcı (constructor) ve her biri için getter metotları ekleyin. Ayrıca sürüm numarasını güncellemek için bir setVersion(int version) metodu ekleyin.

    Document sınıfınızın Cloneable arayüzünü (interface) uygulamasını sağlayın ve bir Document döndürmek için clone() metodunu geçersiz kılın (override). Metot içindeki CloneNotSupportedException hatasını bir RuntimeException içine sararak ele alın.

    toString() metodunu, X, Y ve Z'nin gerçek alan değerleri olduğu Document[title=X, author=Y, version=Z] formatını döndürecek şekilde geçersiz kılın.

  • Main.java: Bir belge oluşturup onu kopyalayarak Document sınıfınızı hayata geçirin. Üç girdi alacaksınız: bir başlık (String), bir yazar (String) ve bir sürüm numarası (int).

    Bu değerlerle orijinal bir Document oluşturun, ardından bir kopya oluşturmak için onu kopyalayın. Kopyalamadan sonra, setVersion() kullanarak kopyanın sürümünü 1 artırarak değiştirin. Bu, kopyanın orijinalden gerçekten bağımsız olduğunu gösterir.

    Üç satır yazdırın:

    1. Original: ve ardından orijinal belgenin toString() çıktısı
    2. Clone: ve ardından kopyalanan belgenin toString() çıktısı
    3. Independent: ve ardından orijinal ile kopyanın farklı nesneler olup olmadığını belirten true veya false (karşılaştırma için != kullanın)

Üç girdi alacaksınız: belge başlığı (String), yazar adı (String) ve sürüm numarası (int).

Kopyanın sürümünü değiştirdikten sonra orijinal belgenin nasıl değişmeden kaldığına dikkat edin; bu, clone() metodunun gerçekten bağımsız bir kopya oluşturduğunu kanıtlar!

Kopya kağıdı

clone() yöntemi bir nesnenin kopyasını oluşturur. Bunu kullanmak için sınıfınızın Cloneable arayüzünü (interface) uygulaması ve Object sınıfındaki clone() yöntemini geçersiz kılması (override) gerekir:

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

Bağımsız kopyalar oluşturma:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy is a separate object with the same values

Varsayılan olarak, clone() yöntemi ilkel (primitive) değerleri ve referansları kopyalayarak bir yüzeysel kopya (shallow copy) gerçekleştirir. Eğer nesneniz alan (field) olarak başka nesneler içeriyorsa, hem orijinal hem de kopya nesne aynı iç içe geçmiş nesnelere referans verecektir. İç içe geçmiş nesnelerle birlikte gerçekten bağımsız kopyalar oluşturmak için, clone() yönteminiz içinde bu iç içe geçmiş nesneleri de kopyalayarak bir derin kopya (deep copy) uygulayın.

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String title = scanner.nextLine();
        String author = scanner.nextLine();
        int version = scanner.nextInt();
        
        // TODO: Giriş değerleriyle orijinal bir Belge (Document) oluşturun
        
        // TODO: Bir kopya oluşturmak için orijinal belgeyi kopyalayın (clone)
        
        // TODO: Kopya belgenin sürümünü 1 artırarak değiştirin
        
        // TODO: "Original: " ve ardından orijinal belgeyi yazdırın
        
        // TODO: "Clone: " ve ardından kopyalanan belgeyi yazdırın
        
        // TODO: "Independent: " ve ardından true/false yazdırın (orijinal != kopya kontrolü yapın)
        
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler