Composition recall that an object of type X that is composed of an object of type Y means X has-a...

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 1 X object, and only the X object, is responsible for its Y ob

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. 3

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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