Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Relevanta dokument
Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 1

Institutionen för TENTAMEN CTH HT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

1 Comparator & Comparable

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

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

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

TDDD78 Viktiga begrepp, del 2

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

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA550 DAG: TID: 14:00 18:00

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

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 13 Innehåll

Programmering för språkteknologer II, HT2014. Rum

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

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Lösningsförslag till tentamen

Tentamen Programmering fortsättningskurs DIT950

TDA550 - Objektorienterad programvaruutveckling, fk

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

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Lösningsförslag till tentamen

Föreläsning 12: Exempel och problemlösning

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

Språkkonventioner och redigering av tal.

12. Relationer och funktioner

Tentamen LÖSNINGSFÖRSLAG

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

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

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

Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

Classes och Interfaces, Objects och References, Initialization

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

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

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 4

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

Repetition av OOP- och Javabegrepp

Konstruktion av klasser med klasser

Repetition av OOP- och Javabegrepp

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

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

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

Objektorienterad programutveckling, fk

Lösningsförslag till exempeltenta 2

Malmö högskola 2008/2009 CTS

TENTAMEN OOP

Programmering för språkteknologer II, HT2011. Rum

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

Tentamen för TTIT71 Programmering kl Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

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

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

Föreläsning 5-6 Innehåll

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

TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

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

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

DAT043 Objektorienterad Programmering

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Föreläsning 9 Innehåll

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

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

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

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

CHALMERS TENTAMEN. 2013/2014, lp 2 DAT050. Uno Holmer. Java API (bifogas tesen) Uno Holmer tel besöker tentamen ca kl samt ca 11.

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

Laboration 13, Arrayer och objekt

Enkla variabler kontra referensvariabel

Objektorienterad programutveckling, fk

OOP Objekt-orienterad programmering

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

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

Institutionen för TENTAMEN CTH VT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Objektorienterad Programmering (TDDC77)

Föreläsning 9: Arv och UML

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Lösningar för tenta 2 DAT043,

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Institutionen för TENTAMEN CTH VT-14 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Transkript:

TDA550 - Objektorienterad programvaruutveckling, fk Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone. Uppgift 1 Icke-muterbarhet kontra muterbarhet Betrakta klassen Period nedan: /** * @invariant getstart() is before or at the same time as getend() * @invariant getstart() consistently returns the same value after object creation * @invariant getend() consistently returns the same value after object creation */ import java.util.date; public final class Period { private final Date start; private final Date end; /** * @param start the beginning of the period * @param end the end of the period * @pre start <= end * @post The time span of the returned period is positive. * @throws IllegalArgumentException if start is after end * @throws NullPointerException if start or end is null */ public Period(Date start, Date end) { if (start.compareto(end) > 0) { throw new IllegalArgumentException(start + " after " + end); this.start = start; this.end = end; public Date getstart() { return start; public Date getend() { return end; Klassen Period representerar ett datumintervall genom att innehålla ett startdatum och ett slutdatum. I kommentarerna till klassen visas dessutom vilket kontrakt implementationen av klassen måste uppfylla ("Programming by Contract"). En invariant är ett villkor som måste vara uppfyllt före och efter varje metodanrop, ett förvillkor utgör krav som måste vara uppfyllda innan en metod anropas och eftervillkor visar samband som gäller efter att metoden körts. a) Några klassinvarianter för Period innebär att avsikten är att klassen skall vara icke-muterbar. Vilka? b) Att en klass är icke-muterbar innebär att när ett objekt av klassen väl instansierats så kommer objektet under resten av sin livslängd att ha samma värden som då det skapades. Har programmeraren gjort sitt jobb eller finns det sätt att bryta mot klassens invarianter? Om så är fallet, vad blir konsekvensen och hur kan vi åtgärda felen? Övning 4 1 TDA550 HT-18

Uppgift 2 Likhet (equals) Anta att standardklassen Float, som representerar reella tal som objekt, är implementerad enligt följande: public class Float { private float f; public Float(float f) { this.f = f; public float floatvalue() { return f; if (! (o instanceof Float)) float f1 = floatvalue(); float f2 = ((Float) o).floatvalue(); return (f1 == f2); // more methods here that don t interest us now Pelle Hacker beslutar att skriva en förbättrad variant av Float-klassen genom att göra en subklass TolerantFloat som tolererar små avvikelser när man jämför huruvida två reella värden är lika. Pelles kod har följande utseende: public class TolerantFloat extends Float { public static final float TOLERANCE = 0.01f; public TolerantFloat(float f) { super (f); if (!(o instanceof Float)) float f1 = floatvalue(); float f2 = ((Float) o).floatvalue(); return (Math.abs(f1 - f2) <= TOLERANCE); Java Language Specification säger att metoden equals -metoden skall uppfylla följande relationer; Reflexivitet: a.equals(a) Symmetri: a.equals(b) b.equals(a) Transitivitet: a.equals(b) && b.equals(c) a.equals(c) i) Är TolerantFloat.equals() reflexiv? Om inte, ge ett exempel som visar detta. ii) Är TolerantFloat.equals() symmetrisk? Om inte, ge ett exempel som visar detta. iii) Är TolerantFloat.equals() transitiv? Om inte, ge ett exempel som visar detta. Övning 4 2 TDA550 HT-18

b) Betrakta klasserna Point och NamedPoint nedan: public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; if (!(o instanceof Point)) { else { Point p = (Point) o; return p.x == x && p.y == y; public class NamedPoint extends Point { private final String name; public NamedPoint(int x, int y, String name) { super(x, y); this.name = name; if (!(o instanceof Point)) { // If o is a normal Point, do a name-blind comparison if (!(o instanceof NamedPoint)) { return o.equals(this); // o is a NamedPoint; do a full comparison return super.equals(o) && ((NamedPoint) o).name.equals(name); Håller relationerna reflexivitet, symmetri och transivitet för equals-metoderna för dessa två klasser? Om inte, vilken eller vilka relationer håller inte? Om någon av relationerna inte håller, hur borde man implementerat equals istället? Övning 4 3 TDA550 HT-18

Uppgift 3 Betrakta nedanstående klass: public class Product { final private int productnumber; private String name; private String description; private int price; //code not of interest here Klassen behöver förses med metoderna equals och hashcode. Nedan ges tre möjliga implementationer av equals respektive tre möjliga implementationer av hashcode : equals version 1: public boolean equals(object obj) { if (this == obj) return true; if (obj == null) if (getclass()!= obj.getclass()) Product other = (Product) obj; return productnumber == other.productnumber ; equals version 3: public boolean equals(object obj) { if (this == obj) return true; if (obj == null) if (getclass()!= obj.getclass()) Product other = (Product) obj; return name.equals(other.name) && description.equals(other.description); equals version 2: public boolean equals(object obj) { if (this == obj) return true; if (obj == null) if (getclass()!= obj.getclass()) Product other = (Product) obj; return name.equals(other.name) && productnumber == other.productnumber ; hashcode version 1: public int hashcode() { return productnumber; hashcode version 2: public int hashcode() { return name.hashcode() + productnumber; hashcode version 3: public int hashcode() { return name.hashcode(); a) Med vilka versioner av equals kan version 1 av hashcode kombineras utan att bryta det kontrakt som The Java Language Specification specificerar. Motivera ditt svar! b) Med vilka versioner av equals kan version 2 av hashcode kombineras utan att bryta det kontrakt som The Java Language Specification specificerar. Motivera ditt svar! c) Med vilka versioner av equals kan version 3 av hashcode kombineras utan att bryta det kontrakt som The Java Language Specification specificerar. Motivera ditt svar! d) Vilken version av equals är lämpligast att avvända. Motivera ditt svar! Övning 4 4 TDA550 HT-18

Uppgift 4 På en nyligen avslutad grundkurs i objektorienterad programutveckling illustrerades arv med följande klasser och interface (för att avbilda geometriska objekt som har en viss färg och en viss placering i det tvådimensionella rummet): Det är i och för sig något suspekt att kunna positionera tredimensionella objekt i ett tvådimensionellt rum, men bortse från detta när du besvarar nedanstående frågor. a) Identifiera och förklara de brister som finns i ovanstående design med avseende på de arvsrelationer som finns. b) Betrakta synligheten av instansvariablerna i respektive klass. Kommentera! c) Betrakta uppsättningen konstruktorer i respektive klass. Kommentera! d) Finns det något att säga om hur tillstånden i klassen GeometricObject har avbildats (dvs vilka instansvariabler som har specificerats och typerna på dessa). e) Implementationen av klassen ComparableCircle har följande utseende: public class ComparableCircle extends Circle implements Comparable { //kod för konstruktorer utelämnad public int compareto(object o) { if (o instanceof ComparableCircle) { if (getradius() > ((Circle) o).getradius()) { return 1; else if (getradius() < ((Circle) o).getradius()) { return -1; else { return 0; throw new IllegalArgumentException(); Klassen borde implementera det generiska gränssnittet Comparable<E> och inte det råa gränssnittet Comparable. Varför? Skriv om klassen så den implementerar gränssnittet Comparable<E>. Övning 4 5 TDA550 HT-18

Uppgift 5 Betrakta nedanstående två klasser för att representera punkter i planet respektive polygoner: public class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; public int getx() { return x; public void setx(int x) { this.x = x; public int gety() { return y; public void sety(int y) { this.y = y; public class Polygon { private ArrayList<Point> points; private int noofpoints; //constructors and methods not shown here. a) Skriv en clone-metod för klassen Point, samt ange vad som i övrigt behöver göras för att klassen Point skall bli kloningsbar. b) Skriv en clone-metod, som returnerar en djup kopia, för klassen Polygon, samt ange vad som i övrigt behöver göras för att klassen Polygon skall bli kloningsbar. Övning 4 6 TDA550 HT-18

Uppgift 6 Samma kontra lika Betrakta nedanstående klass: public class References { public static void main(string[ ] args) { stringrefs(); integerrefs(); private static void printintegereq(string exp, boolean b) { System.out.println(exp + " -> " + b); private static void printstringideq(string aname, String bname,object a, Object b) { System.out.println(aName + " == " + bname + " -> " + (a == b) + "\t" + aname + ".equals(" + bname + ") -> " + a.equals(b)); private static void stringrefs() { String s1 = new String("False"); String s2 = new String("False"); printstringideq ("s1", "s2", s1, s2); String s3 = "True"; String s4 = "Tr" + "ue"; printstringideq ("s3", "s4", s3, s4); String s5 = "False"; String sx = "F"; String s6 = sx + "alse"; printstringideq ("s5", "s6", s5, s6); private static void integerrefs() { Integer i = new Integer(2); Integer j = new Integer(2); printintegereq ("i >= j", i >= j); printintegereq ("i == j", i == j); printintegereq ("i == 2", i == 2); När main-metoden exekveras erhålls följande utskrifter: s1 == s2 -> false s1.equals(s2) -> true s3 == s4 -> true s3.equals(s4) -> true s5 == s6 -> false s5.equals(s6) -> true i >= j -> true i == j -> false i == 2 -> true Troligen är inte detta vad man förväntar sig! För att förstå varför utskriften blir som den blir måste man söka förklaringen i hur Java har implementerar klassen String och omslagsklassen Integer. Slå upp detta i The Java Language Specification, Java SE 8 Edition (delkapitel 3.10.5 respektive 5.1.1 5.1.8) och förklara sedan resultatet i ovanstående utskrift. Övning 4 7 TDA550 HT-18