composition recall that an object of type x that is composed of an object of type y means x has-a...
DESCRIPTION
Test Your Knowledge 1. A Book has a title and a number of pages. Implement a reasonable default constructor. 2. A Triangle has three points name p1, p2, and p3, represented by Vector2d objects. By default, the points have coordinates (0, 0), (1, 0), and (0, 1). Implement the default constructor. 3TRANSCRIPT
![Page 1: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/1.jpg)
Composition recall that an object of type X that is
composed of an object of type Y means X has-a Y object and X owns the Y object
in other words
1
the X object, and only the X object, is responsible for its Y object
![Page 2: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/2.jpg)
Composition & the Default Constructor
if a default constructor is defined it must create a suitable Y objectpublic X() {
// create a suitable Y; for example // 1. this.y = new Y(); // 2. this.y = new Y( /* suitable arguments */ );
}
2
the X object, and only the X object, is responsible for its Y object
![Page 3: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/3.jpg)
Test Your Knowledge1. A Book has a title and a number of pages.
Implement a reasonable default constructor.
2. A Triangle has three points name p1, p2, and p3, represented by Vector2d objects. By default, the points have coordinates (0, 0), (1, 0), and (0, 1). Implement the default constructor.
3
![Page 4: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/4.jpg)
Composition & Copy Constructor
if a copy constructor is defined it must create a new Y that is a deep copy of the other X object’s Y objectpublic X(X other) {
// create a new Y that is a copy of other.y; for example // 1. this.y = new Y(other.y);
// 2. this.y = new Y(other.getY());}
4
the X object, and only the X object, is responsible for its Y object
![Page 5: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/5.jpg)
Composition & Copy Constructor what happens if the X copy constructor does not
make a deep copy of the other X object’s Y object?// don’t do thispublic X(X other){ this.y = other.y;}
every X object created with the copy constructor ends up sharing its Y object if one X modifies its Y object, all X objects will end up with a
modified Y object this is called a privacy leak
5
![Page 6: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/6.jpg)
Test Your Knowledge1. Suppose Y is an immutable type. Does the X
copy constructor need to create a new Y? Why or why not?
2. Implement the Book copy constructor.
6
![Page 7: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/7.jpg)
7
3. Suppose you have a Triangle copy constructor and main method like so:
public Triangle(Triangle t){ this.p1 = t.p1; this.p2 = t.p2; this.p3 = t.p3; }
public static void main(String[] args) { Triangle t1 = new Triangle(); Triangle t2 = new Triangle(t1); t1.p1.set( -100, -100 ); System.out.println( t2.p1 );}
What does the program print? How many Vector2d objects are there in memory? How many Vector2d objects should be in memory? Implement a better copy constructor.
![Page 8: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/8.jpg)
Composition & Other Constructors
a constructor that has a Y parameter must first deep copy and then validate the Y objectpublic X(Y y) {
// create a copy of y this.y = new Y(y); // validate this.checkY(this.y); // throws an exception if // this.y is invalid
}
8
the X object, and only the X object, is responsible for its Y object
![Page 9: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/9.jpg)
Composition & Other Constructors it may be possible to fix a bad Y object in some
casespublic X(Y y) {
// create a copy of y this.y = new Y(y); // validate; checkY returns false for invalid Y if(this.checkY(this.y) == false) { this.fixY(this.y); }
}
9
![Page 10: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/10.jpg)
Composition and Other Constructors why is the deep copy required?
if the constructor does this
// don’t do this for compositionpublic X(Y y) { this.y = y;
}
then the client and the X object will share the same Y object this is called a privacy leak
10
the X object, and only the X object, is responsible for its Y object
![Page 11: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/11.jpg)
Test Your Knowledge1. Suppose Y is an immutable type. Does the X
constructor need to copy the other X object’s Y object? Why or why not?
2. Implement the following Triangle constructor:/** * Create a Triangle from 3 points * @param p1 The first point. * @param p2 The second point. * @param p3 The third point. * @throws IllegalArgumentException if the 3 points are * not unique */
11
Triangle has a classinvariant: the 3 pointsof a Triangle are unique
![Page 12: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/12.jpg)
Test Your Knowledge3. Implement the following Triangle
constructor; make sure you maintain the class invariant:
/** * Create a Triangle from 3 points * @param p1 The first point. * @param p2 The second point. * @param p3 The third point.
*/
12
Triangle has a classinvariant: the 3 pointsof a Triangle are unique
![Page 13: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/13.jpg)
Composition and Accessors
never return a reference to an attribute; always return a deep copy
public Y getY(){ return new Y(this.y);}
13
the X object, and only the X object, is responsible for its Y object
![Page 14: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/14.jpg)
Composition and Accessors why is the deep copy required?
if the accessor does this
// don’t do this for compositionpublic Y getY() { return this.y;
}
then the client and the X object will share the same Y object this is called a privacy leak
14
the X object, and only the X object, is responsible for its Y object
![Page 15: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/15.jpg)
Test Your Knowledge1. Suppose Y is an immutable type. Does the X
accessor need to copy it’s Y object before returning it? Why or why not?
2. Implement the following 3 Triangle accessors:/** * Get the first/second/third point of the triangle. * @return The first/second/third point of the triangle */
15
![Page 16: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/16.jpg)
Test Your Knowledge3. Given your Triangle accessors from
question 2, can you write an improved Triangle copy constructor that does not make copies of the point attributes?
16
![Page 17: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/17.jpg)
Composition and Mutators
if X has a method that sets its Y object to a client-provided Y object then the method must make a deep copy of the client-provided Y object and validate itpublic void setY(Y y) { Y copyY = new Y(y); this.checkY(copyY); // throws an exception if copyY // is invalid this.y = copyY;
}
17
the X object, and only the X object, is responsible for its Y object
![Page 18: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/18.jpg)
Composition and Mutators it may be possible to fix a bad Y object in some
casespublic void setY(Y y){ Y copyY = new Y(y);
if(this.checkY(copyY) == false) { this.fixY(copyY); } this.y = copyY;
}
18
![Page 19: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/19.jpg)
Composition and Mutators why is the deep copy required?
if the mutator does this
// don’t do this for compositionpublic void setY(Y y) { this.y = y;
}
then the client and the X object will share the same Y object this is called a privacy leak
19
the X object, and only the X object, is responsible for its Y object
![Page 20: Composition recall that an object of type X that is composed of an object of type Y means X has-a Y object and X owns the Y object in other words](https://reader035.vdocuments.mx/reader035/viewer/2022062401/5a4d1b1a7f8b9ab059993132/html5/thumbnails/20.jpg)
Test Your Knowledge1. Suppose Y is an immutable type. Does the X
mutator need to copy the Y object? Why or why not? Does it need to the validate the Y object?
2. Implement the following 3 Triangle mutators:/** * Set the first/second/third point of the triangle. * @param p The desired first/second/third point of * the triangle. * @return true if the point could be set; * false otherwise */
20
Triangle has a classinvariant: the 3 pointsof a Triangle are unique