Period Class
-
Upload
aidan-cooper -
Category
Documents
-
view
37 -
download
0
description
Transcript of Period Class
![Page 1: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/1.jpg)
Period Class adapted from Effective Java by Joshua Bloch
available online at http://www.informit.com/articles/article.aspx?p=31551&seqNum=2
we want to implement a class that represents a period of time has-a Date representing the start of the time
period has-a Date representing the end of the time
period class invariant: start of time period is always
prior to the end of the time period1
![Page 2: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/2.jpg)
2
public final class Period {
private Date start;
private Date end;
/**
* @param start beginning of the period.
* @param end end of the period; must not precede start.
* @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;
}
![Page 3: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/3.jpg)
Test Your Knowledge1. Is Date mutable or immutable?2. Is Period implementing aggregation or
composition?3. Add 1 more line of client code to the
following that shows how the client can break the class invariant:
Date start = new Date();
Date end = new Date( start.getTime() + 10000 );
Period p = new Period( start, end );
4. Fix the constructor.
3
![Page 4: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/4.jpg)
4
/**
* @return the start Date of the period
*/
public Date getStart()
{
return this.start;
}
/**
* @return the end Date of the period
*/
public Date getEnd()
{
return this.end;
}
![Page 5: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/5.jpg)
Test Your Knowledge1. Add 1 more line of client code to the
following that shows how the client can break the class invariant using either of the start or end methods
Date start = new Date();
Date end = new Date( start.getTime() + 10000 );
Period p = new Period( start, end );
5
![Page 6: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/6.jpg)
6
/**
* Creates a time period by copying another time period.
* @param other the time period to copy
*/
public Period( Period other )
{
this.start = other.start;
this.end = other.end;
}
![Page 7: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/7.jpg)
Test Your Knowledge1. What does the following program print?
Date start = new Date();
Date end = new Date( start.getTime() + 10000 );
Period p1 = new Period( start, end );
Period p2 = new Period( p1 );
System.out.println( p1.getStart() == p2.getStart() );
System.out.println( p1.getEnd() == p2.getEnd() );
2. Fix the copy constructor.
7
Date does not provide a copy constructor. To copy a Date object d: Date d = new Date(); Date dCopy = new Date( d.getTime() );
![Page 8: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/8.jpg)
8
/**
* Sets the start time of the period.
* @param newStart the new starting time of the period
* @return true if the new starting time is earlier than
* the current end time; false otherwise
*/
public boolean setStart(Date newStart)
{
boolean ok = false;
if ( newStart.compareTo(this.end) < 0 )
{
this.start = newStart;
ok = true;
}
return ok;
}
![Page 9: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/9.jpg)
Test Your Knowledge1. Add 1 more line of client code to the
following that shows how the client can break the class invariant
Date start = new Date();
Date end = new Date( start.getTime() + 10000 );
Period p = new Period( start, end );
p.setStart( start );
2. Fix the accessors and setStart.
9
![Page 10: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/10.jpg)
Privacy Leaks a privacy leak occurs when a class exposes a
reference to a non-public attribute (that is not a primitive or immutable) given a class X that is a composition of a Y
these are all examples of privacy leaks
10
public class X { private Y y; // …}
public X(Y y) { this.y = y;}
public X(X other) { this.y = other.y;}
public Y getY() { return this.y;}
public void setY(Y y) { this.y = y;}
![Page 11: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/11.jpg)
Consequences of Privacy Leaks a privacy leak allows some other object to
control the state of the object that leaked the attribute the object state can become inconsistent
example: if a Deck exposes a reference to its cards Set then a client can add or remove cards from the deck without calling the deal or take methods
it becomes impossible to guarantee class invariants example: if a Triangle exposes a reference to one of its
points then it can no longer guarantee that its points will always be unique
composition becomes broken because the object no longer owns its attribute when an object “dies” it’s parts may not die with it
11
![Page 12: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/12.jpg)
Collections and Arrays
(As Attributes) Chap 5 Notes
12
![Page 13: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/13.jpg)
A Note on the Notes Chapter 5 of the course notes is a work in
progress the iterator method of Student does not match
any method in the Student API the API advertises courseIterator and gpaIterator
the notes say that Student implements Iterable<Course> the API does not
page 93 has an interesting equation and refers to a missing Definition
13
![Page 14: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/14.jpg)
A Note on PEx05 PEx05 requires you to write an iterator class
for an array notes 5.2.6 gives an example of how to do this
I will try to post another example to the website by Friday
14
![Page 15: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/15.jpg)
Motivation often you will want to implement a class that
has-a collection as an attribute a university has-a collection of faculties and each
faculty has-a collection of schools and departments
a molecule has-a collection of atoms a person has-a collection of acquaintances from the notes, a student has-a collection of GPAs
and has-a collection of courses a polygonal model has-a collection of triangles*
15
*polygons, actually, but triangles are easier to work with
![Page 16: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/16.jpg)
What Does a Collection Hold? a collection holds references to instances
it does not hold the instances
16
ArrayList<Date> dates = new ArrayList<Date>();
Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();
dates.add(d1);dates.add(d2);dates.add(d3);
100 client invocation
dates 200
d1 500
d2 600
d3 700
...
200 ArrayList object
500
600
700
![Page 17: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/17.jpg)
Test Your Knowledge1. What does the following print?
ArrayList<Vector2d> vecs = new ArrayList<Vector2d>();
Vector2d v = new Vector2d();
vecs.add(v);
v.setX( 10.0 );
v.setY( 20.0 );
System.out.println(v);
System.out.println(vecs.get(0));
2. Is an ArrayList<X> an aggregation of X or a composition of X?
17
![Page 18: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/18.jpg)
Student Class (from notes) a Student has-a string id a Student has-a collection of yearly GPAs a Student has-a collection of courses
18
Student Set<Course>List<Double>
1 1
Double CourseString
14 *
gpas courses
id
![Page 19: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/19.jpg)
PolygonalModel Class a polygonal model has-a List of Triangles
aggregation implements Iterable<Triangle>
allows clients to access each Triangle sequentially
class invariant List never null
19
PolygonalModel List<Triangle>
1
Triangle
*
tri
![Page 20: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/20.jpg)
PolygonalModelclass PolygonalModel implements Iterable<Triangle>{ private List<Triangle> tri;
public PolygonalModel() { tri = new ArrayList<Triangle>(); }
public Iterator<Triangle> iterator() { return this.tri.iterator(); }
20
![Page 21: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/21.jpg)
PolygonalModel public void clear()
{
// removes all Triangles
this.tri.clear();
}
public int size()
{
// returns the number of Triangles
return this.tri.size();
}
21
![Page 22: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/22.jpg)
Collections as Attributes when using a collection as an attribute of a
class X you need to decide on ownership issues does X own or share its collection? if X owns the collection, does X own the objects
held in the collection?
22
![Page 23: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/23.jpg)
X Shares its Collection with other Xs if X shares its collection with other X
instances, then the copy constructor does not need to create a new collection the copy constructor can simply assign its
collection [notes 5.1.3] refer to this as aliasing
23
![Page 24: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/24.jpg)
PolygonalModel Copy Constructor 1 public PolygonalModel(PolygonalModel p)
{
// implements aliasing (sharing) with other
// PolygonalModel instances
this.setTriangles( p.getTriangles() );
}
private List<Triangle> getTriangles()
{ return this.tri; }
private void setTriangles(List<Triangle> tri)
{ this.tri = tri; }
24
![Page 25: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/25.jpg)
Test Your Knowledge1. Suppose you have a PolygonalModel p1 that
has 100 Triangles. What does the following code print?
PolygonalModel p2 = new PolygonalModel(p1);
p2.clear();
System.out.println( p2.size() );
System.out.println( p1.size() );
25
![Page 26: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/26.jpg)
X Owns its Collection Part 1 if X owns its collection but not the objects in
the collection then the copy constructor can perform a shallow copy of the collection
a shallow copy of a collection means X creates a new collection the references in the collection are the same as
the references in the other collection
26
![Page 27: Period Class](https://reader036.fdocuments.in/reader036/viewer/2022062321/56813347550346895d9a4435/html5/thumbnails/27.jpg)
the hard way to perform a shallow copy
the easy way to perform a shallow copy
27
// assume there is an ArrayList<Date> datesArrayList<Date> sCopy = new ArrayList<Date>();for(Date d : dates){ sCopy.add(d);}
// assume there is an ArrayList<Date> datesArrayList<Date> sCopy = new ArrayList<Date>(dates);