Metodo clone()
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 43 di 87.
Il metodo clone() crea una copia di un oggetto. Per usarlo, la tua classe deve implementare l'interfaccia Cloneable e sovrascrivere il metodo clone() della classe Object.
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);
}
}
}Ora puoi creare copie indipendenti degli oggetti:
Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy è un oggetto distinto con gli stessi valoriPer impostazione predefinita, clone() esegue una copia superficiale, ovvero copia i valori primitivi e i riferimenti. Se il tuo oggetto contiene altri oggetti come campi, sia l'originale sia il clone faranno riferimento agli stessi oggetti annidati. Per ottenere copie davvero indipendenti con oggetti annidati, devi implementare una copia profonda clonando anche quegli oggetti annidati all'interno del tuo metodo clone().
Sfida
FacileCostruiamo un sistema di gestione dei documenti che dimostri la clonazione degli oggetti. Creerai una classe Document che può essere clonata per creare copie indipendenti, consentendo agli utenti di duplicare i documenti mantenendo intatto l'originale.
Organizzerai il codice in due file:
Document.java: crea una classe che rappresenti un documento e supporti la clonazione. Un Document ha tre campi privati:title(String),author(String) eversion(int). Includi un costruttore per inizializzare tutti i campi e metodi getter per ciascuno. Aggiungi anche un metodosetVersion(int version)per aggiornare il numero di versione.Fai implementare alla tua classe Document l'interfaccia
Cloneablee sovrascrivi il metodoclone()affinché restituisca unDocument. Gestisci laCloneNotSupportedExceptionall'interno del metodo avvolgendola in unaRuntimeException.Sovrascrivi
toString()affinché restituisca:Document[title=X, author=Y, version=Z]dove X, Y e Z sono i valori effettivi dei campi.Main.java: dai vita alla tua classe Document creando un documento e clonandolo. Riceverai tre input: un titolo (String), un autore (String) e un numero di versione (int).Crea un Document originale con questi valori, quindi clonalo per creare una copia. Dopo la clonazione, modifica la versione della copia incrementandola di 1 usando
setVersion(). In questo modo dimostrerai che il clone è davvero indipendente dall'originale.Stampa tre righe:
Original:seguito dal toString() del documento originaleClone:seguito dal toString() del documento clonatoIndependent:seguito datrueofalse, a indicare se l'originale e il clone sono oggetti diversi (usa il confronto!=)
Riceverai tre input: il titolo del documento (String), il nome dell'autore (String) e il numero di versione (int).
Nota che, dopo aver modificato la versione del clone, il documento originale rimane invariato. Questo dimostra che clone() ha creato una copia davvero indipendente!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi i dati di input
String title = scanner.nextLine();
String author = scanner.nextLine();
int version = scanner.nextInt();
// TODO: Crea un Document originale con i valori di input
// TODO: Clona il documento originale per creare una copia
// TODO: Modifica la versione del clone incrementandola di 1
// TODO: Stampa "Original: " seguito dal documento originale
// TODO: Stampa "Clone: " seguito dal documento clonato
// TODO: Stampa "Independent: " seguito da true/false (verifica se original != clone)
}
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online