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

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

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

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

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

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

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

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

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

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

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

1 Comparator & Comparable

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

TDDD78 Viktiga begrepp, del 2

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

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

Lösningsförslag till tentamen

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

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

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

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

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

Föreläsning 13 Innehåll

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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.

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

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

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

TDA550 - Objektorienterad programvaruutveckling, fk

public class BoundedCounter {

Tentamen LÖSNINGSFÖRSLAG

Tentamen Programmering fortsättningskurs DIT950

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

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

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

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

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

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

Repetition av OOP- och Javabegrepp

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

Classes och Interfaces, Objects och References, Initialization

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

Repetition av OOP- och Javabegrepp

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

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

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 {... }

Lösningsförslag till tentamen

Språkkonventioner och redigering av tal.

Objektorienterad Programmering (TDDC77)

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

Instuderingsuppgifter läsvecka 2

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

12. Relationer och funktioner

Konstruktion av klasser med klasser

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

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

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

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

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

TENTAMEN OOP

Laboration 13, Arrayer och objekt

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

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

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

Exempel på användning av arv: Geometriska figurer

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.

Objektorienterad programutveckling, fk

Föreläsning 9 Innehåll

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

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

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

Malmö högskola 2008/2009 CTS

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

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

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Lösningsförslag till exempeltenta 2

Föreläsning 9: Arv och UML

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

Föreläsning 5-6 Innehåll

Lösningsförslag till tentamen

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, 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.

Föreläsning 2, vecka 7: Arv, subtyper och Javas API

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

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

Lösningar för tenta 2 DAT043,

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

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

Enkla variabler kontra referensvariabel

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

Transkript:

TDA550 - Objektorienterad programvaruutveckling IT, fk Övning vecka 4. Denna vecka 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; //Period 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 vecka 4 1 TDA550 HT-16

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; //constructor public float floatvalue() { return f; //floatvalue if (! (o instanceof Float)) float f1 = this.floatvalue(); float f2 = ((Float) o).floatvalue(); return (f1 == f2); //equal // more methods here that don t interest us now //Float 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); //constructor if (!(o instanceof Float)) float f1 = this.floatvalue(); float f2 = ((Float) o).floatvalue(); return (Math.abs(f1 - f2) <= TOLERANCE); //equals // TolerantFloat Java Language Specification säger att metoden equals -metoden skall uppfylla följande relationer; Reflexivitet: Symmetri: Transitivitet: a.equals(a) a.equals(b) b.equals(a) 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 vecka 4 2 TDA550 HT-16

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 == this.x && p.y == this.y; //Point 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 == this.name; // NamedPoint 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 vecka 4 3 TDA550 HT-16

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 //Product 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 this.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 this.name.equals(other.name) && this.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 this.name.equals(other.name) && this.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 vecka 4 4 TDA550 HT-16

Uppgift 4 På en nyligen avslutad grundkurs i objektorienterad programutveckling illustrerades arv med följande klasser och interface (för att avbildar geometriska objekt som har en viss färg och en viss placering i det tvådimensionella rummet): GeometricObject {abstract #color: String #x: int #y:int +GeometricObject() +GeometricObject(color) +getcolor(): String +setcolor(color): void +getx(): int +setx(x): void +gety(): int +sety(y): void +move(x, y): void +findarea(): double +findperimeter(): double Circle -radius: double +Circle() +Circle(radius, color) +getradius(): double +setradius(radius): void +findarea(): double +findperimeter(): double Cylinder -length: double +Cylinder() +Cylinder(radius, length) +Cylinder(radius, color, length) +getlength(): double +setlength(length): void +findarea(): double +findvolume(): double ComparableCircle +ComparableCircle(radius, color) +compareto(object): int <<interface>> Comparable +compareto(object): int ComparableCylinder +ComparableCylinder(radius, length) +compareto(object): int 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) Visa med ett (minimalt) UML-diagram en alternativ design, som inte lider av de brister du identifierat i deluppgift a). c) Betrakta synligheten av instansvariablerna i respektive klass. Kommentera! d) Betrakta uppsättningen konstruktorer i respektive klass. Kommentera! e) Finns det något att sägas om hur tillstånden i klassen GeometricObject har avbildats (dvs vilka instansvariabler som har specificerats och typerna på dessa). f) 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(); //compareto //ComparableCircle Klassen borde implementera det generiska gränssnittet Comparable<E> och inte det råa interfacet Comparable. Varför? Skriv om klassen så den den implementera gränssnittet Comparable<E>. Övning vecka 4 5 TDA550 HT-16

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; //Point public class Polygon { private ArrayList<Point> points; private int noofpoints; //constructors and methods not shown here. //Polygon 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 vecka 4 6 TDA550 HT-16

Uppgift 6 Samma kontra lika Betrakta nedanstående klass: public class References { public static void main(string[ ] args) { stringrefs(); integerrefs(); private static void print(string exp, boolean b) { System.out.println(exp + " -> " + b); private static void printideq(object a, Object b, String aname, String bname) { System.out.println(aName + " == " + bname + " -> " + (a == b) + "\t" + aname + ".equals(" + bname + ") -> " + a.equals(b)); private static void stringrefs() { String s3 = new String("False"); String s4 = new String("False"); printideq(s3, s4, "s3", "s4"); String s5 = "True"; String s6 = "Tr" + "ue"; printideq(s5, s6, "s5", "s6"); String s7 = "False"; String sx = "F"; String s8 = sx + "alse"; printideq(s7, s8, "s7", "s8"); private static void integerrefs() { Integer i = new Integer(2); Integer j = new Integer(2); print("i >= j", i >= j); print("i == j", i == j); print("i == 2", i == 2); //References När main-metoden exekveras erhålls följande utskrifter: s3 == s4 -> false s3.equals(s4) -> true s5 == s6 -> true s5.equals(s6) -> true s7 == s8 -> false s7.equals(s8) -> 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 implementerat klassen String och omslagsklassen Integer. Slå upp detta i The Java Language Specification, Java SE 7 Edition (delkapitel 3.10.5 respektive 5.1.1 5.1.8) och förklara sedan resultatet i ovanstående utskrift. Övning vecka 4 7 TDA550 HT-16