Composition recall that an object of type X that is composed of an object of type Y means X has-a...
-
Upload
gertrude-collins -
Category
Documents
-
view
219 -
download
0
description
Transcript of Composition recall that an object of type X that is composed of an object of type Y means X has-a...
![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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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.fdocuments.us/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