Kopiering av objekt i Java



Relevanta dokument
Objektorienterad Programkonstruktion. Föreläsning jan 2016

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Generisk klass med typparameter Inre klass - ListIterator

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

DAT043 - Föreläsning 7

Objektorienterad programmering i Java

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Arrayer. results

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Java, klasser, objekt (Skansholm: Kapitel 2)

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

OOP Objekt-orienterad programmering

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

1 Comparator & Comparable

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Arv och polymorfism i Java

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektsamlingar i Java

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Objektorienterad Programmering (TDDC77)

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

OOP Objekt-orienterad programmering

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Laboration A Objektsamlingar

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Classes och Interfaces, Objects och References, Initialization

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Agenda. Objektorienterad programmering Föreläsning 13

Lösningar för tenta 2 DAT043,

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Generiska konstruktioner. Kursbokens kapitel 13

OOP Objekt-orienterad programmering

Föreläsning 5-6 Innehåll

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

ID1004 Laboration 4, November 2012

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Repetition av OOP- och Javabegrepp

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

DAT043 Objektorienterad Programmering

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Repetition av OOP- och Javabegrepp

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Föreläsning REPETITION & EXTENTA

Laboration 1 - Grunderna för OOP i Java

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Konstruktion av klasser med klasser

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

TDDC76 - Programmering och Datastrukturer

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Objektorienterad Programmering (TDDC77)

Objektorienterad programutveckling, fk

Modeller, Objekt och Klasser

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Datastrukturer. föreläsning 3. Stacks 1

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad programmering. Grundläggande begrepp

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

TDDC76 - Programmering och Datastrukturer

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Transkript:

1 (6) Kopiering av objekt i Java Först När du läser detta papper bör du samtidigt studera dokumentationen för klasserna Object, Cloneable (java.lang) och ArrayList (java.util). Mycket blir klarare genom att köra exemplen nedan i BlueJ och använda Object inspector för att utforska objektstrukturerna genom att följa pekarna så långt det går. Filerna finns i kloning.zip på kurshemsidan. Kopiering av objekt i Java Ibland är grund kopiering av objekt önskvärd men oftast krävs djup kopiering. Metoden clone I java finns standardmetoden clone för kopiering av objekt. Metoden definieras i superklassen Object och ärvs därför av alla klasser. Den ärvda clone returnerar en grund kopia av objektet den anropas för. Klasser som har ickeprimitiva instansvariabler (de innehåller objektreferenser) måste överskugga clone så att den kopiar djupt. Görs detta rätt kommer klassen att tillåta kopiering med clone på ett standardmässigt sätt. Avvikelser bör dokumenteras, se t.ex ArrayList.clone. Felaktig kopiering som lämnar objektstrukturer delade mellan flera objekt kan ge upphov till svårupptäckta fel! Gränssnittet Cloneable En klass som implementerar gränssnittet (interface) Cloneable tillåter Object.clone att kopiera klassens instansvariabler grunt. Om clone anropas för ett objekt där klassen inte deklarerar att den implementerar Cloneable kastas undantaget CloneNotSupportedException. En klass vars objekt skall vara kopierbara 1. implementerar gränssnittet Cloneable 2. överskuggar metoden clone Object clone() Cloneable Kopierbar clone()

2 (6) Definitionen får typiskt följande form public class Kopierbar implements Cloneable { public Kopierbar clone() throws CloneNotSupportedException { Kopierbar kopia = (Kopierbar)super.clone(); return kopia; Om klassen endast har instansvariabler av primitiva datatyper, alltså inga objekttyper, räcker ovanstående eftersom grund och djup kopiering då ger samma resultat. Annars måste anropet super.clone() kompletteras med egen kopiering av de variabler som kopierats grunt av super.clone(). Observera typomvandlingen från Object till Kopierbar av returvärdet från clone, denna omvandling är nödvändig för att kunna hantera objektet lokalt. Omvandlingen är säker eftersom super.clone() alltid returnerar ett objekt av samma dynamiska typ som objektet den anropas för. Ibland är det nödvändigt att göra all kopiering själv. Följande exempel visar vilka problem som kan uppstå. Anm. Överskuggade clone-metoder kan ha returtypen Object, eller den aktuella klassen (kovariant returtyp, se OH från den andra föreläsningen om arv). Exempel För att illustrera hur kloning av objekt går till i Java definierar vi klasserna MyClass och Listelement. För att förenkla koden låter vi alla instansvariabler vara publika (huh!). public class MyClass implements Cloneable { public int anint; // en primitiv variabel public ArrayList<ListElement> ; // objekt, se upp! public MyClass () { anint = 123; = new ArrayList<ListElement>();.add(new ListElement("text 1")); public Object clone()throws CloneNotSupportedException { public class ListElement implements Cloneable { public String ; public ListElement(String ) { this. = ; public ListElement clone() throws CloneNotSupportedException { return (ListElement)super.clone();

3 (6) Ett objekt av klassen MyClass har följande struktur :MyClass anint 123 :ArrayList text 1 Följande kodavsnitt antas exekveras i samtliga tre exempel som följer: MyClass a,b; MyClass a = new MyClass(); // ger strukturen i figuren ovan MyClass b = a.clone(); b.anint = 456; b..get(0). = "text 2"; b..add(new ListElement("text 3")); MyClass.clone() - försök 1 Som nämndes ovan räcker det inte att definiera clone så här public MyClass clone() throws CloneNotSupportedException { return (MyClass)super.clone(); super.clone() returnerar att nytt objekt som blir en grund kopia av det aktuella objektet. Resultatet blir att variablen anint kopieras korrekt, eftersom det har typen int, medan i båda objekten kommer att referera till samma listobjekt. Efter att de tre sista satserna exekverats ser objektstrukturen ut som figuren på nästa sida visar.

4 (6) a:myclass anint 123 text 3 b:myclass anint 456 text 2 Vi ser att listan delas mellan båda objekten, och det var ju inte meningen! MyClass.clone() - försök 2 För att undvika delning av listan måste den klonas separat: 1 public MyClass clone() { try { MyClass copy = (MyClass)super.clone(); copy. = (ArrayList<ListElement>).clone(); return copy; catch (CloneNotSupportedException e) { throw new InternalError(); Nu borde väl allt stämma? Nej! Som framgår av nästa figur kopieras visserligen listan, men listelementen är också objekt och listklassens clone kan bara ta ansvar för själva liststrukturen (dess ryggrad ), inte för elementen. Följden blir att de listelement som existerade före kopieringen av listan kommer att delas mellan originallistan och dess kopia. Anm. När super.clone anropas ovan så anropas clone i klassen Object. Om denna metod av någon anledning misslyckas måste det bero på något internt fel i den virtuella maskinen. Ett sådant fel måste betraktas som mycket allvarligt och försök till återhämtning är därför ej meningsfullt. Därför fångas undantaget och istället kastas InternalError. Det är inte meningen att InternalError skall fångas av klienten till MyClass. Ovanstående sätt att definiera clone kan användas för klasser som är direkta subklasser till Object. 1 Konstruktionen try/catch gås igenom i föreläsningen om felhantering.

5 (6) a:myclass anint 123 b:myclass anint 456 text 2 text 3 MyClass.clone() - försök 3 Vi går nu ett steg längre och kopierar även själva listelementen. public MyClass clone() { try { // kopiera hela detta objekt grunt MyClass copy = (MyClass)super.clone(); // kopiera listan djupt (elementen grunt) copy. = (ArrayList<ListElement>).clone(); // kopiera elementen djupt for ( int i = 0; i <.size(); i++ ) copy..set(i,.get(i).clone()); return copy; catch (CloneNotSupportedException e) { throw new InternalError();

6 (6) Resultatet av ett anrop av denna sista version av clone (samt övriga satser) visas i nästa figur. Vi ser att såväl lista som element kopierats djupt. a:myclass anint 123 text 1 b:myclass anint 456 text 2 text 3 Slutsats Designprincip: Ansvarssdriven design. Varje klass som definierar om metoden clone måste ta ansvar för kopiering av alla objektstrukturer som klassen själv implementerar, inget annat. I vårt exempel finns två klasser, MyClass och Listelement. Notera att MyClass inte behöver, eller skall, kopiera interna objekt i Listelement, den skall lita på att Listelement sköter det. I de två första misslyckade varianterna av MyClass.clone föll strukturer som MyClass borde ansvara för mellan stolarna. Vid programmering i Java är det mycket viktigt att komma ihåg att alla objekt hanteras med referenser samt skillnaden mellan grund och djup kopiering.