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 nesnedirVarsayı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.
Görev
KolayNesne 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) veversion(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 birsetVersion(int version)metodu ekleyin.Document sınıfınızın
Cloneablearayüzünü (interface) uygulamasını sağlayın ve birDocumentdöndürmek içinclone()metodunu geçersiz kılın (override). Metot içindekiCloneNotSupportedExceptionhatasını birRuntimeExceptioniçine sararak ele alın.toString()metodunu, X, Y ve Z'nin gerçek alan değerleri olduğuDocument[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:
Original:ve ardından orijinal belgenin toString() çıktısıClone:ve ardından kopyalanan belgenin toString() çıktısıIndependent:ve ardından orijinal ile kopyanın farklı nesneler olup olmadığını belirtentrueveyafalse(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 valuesVarsayı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)
}
}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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı