2.8: Adding Times
- Page ID
- 20789
Suppose you are going to a movie that starts at 18:50 (or 6:50 PM), and the running time is 2 hours 16 minutes. What time does the movie end?
We’ll use Time
objects to figure it out. Here are two ways we could “add” Time
objects:
- We could write a static method that takes the two
Time
objects as parameters. - We could write an instance method that gets invoked on one object and takes the other as a parameter.
To demonstrate the difference, we’ll do both. Here is a rough draft that uses the static approach:
public static Time add(Time t1, Time t2) { Time sum = new Time(); sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; return sum; }
And here’s how we would invoke the static method:
Time startTime = new Time(18, 50, 0.0); Time runningTime = new Time(2, 16, 0.0); Time endTime = Time.add(startTime, runningTime);
On the other hand, here’s what it looks like as an instance method:
public Time add(Time t2) { Time sum = new Time(); sum.hour = this.hour + t2.hour; sum.minute = this.minute + t2.minute; sum.second = this.second + t2.second; return sum; }
The changes are:
- We removed the keyword
static
. - We removed the first parameter.
- We replaced
t1
withthis
.
Optionally, you could replace t2
with that
. Unlike this
, that
is not a keyword; it’s just a slightly clever variable name.
And here’s how we would invoke the instance method:
Time endTime = startTime.add(runningTime);
That’s all there is to it. Static methods and instance methods do the same thing, and you can convert from one to the other with just a few changes.
There’s only one problem: the addition code itself is not correct. For this example, it returns 20:66, which is not a valid time. If second
exceeds 59, we have to “carry” into the minutes column, and if minute
exceeds 59, we have to carry into hour
.
Here is a better version of add
:
public Time add(Time t2) { Time sum = new Time(); sum.hour = this.hour + t2.hour; sum.minute = this.minute + t2.minute; sum.second = this.second + t2.second; if (sum.second >= 60.0) { sum.second -= 60.0; sum.minute += 1; } if (sum.minute >= 60) { sum.minute -= 60; sum.hour += 1; } return sum; }
It’s still possible that hour
may exceed 23, but there’s no days
attribute to carry into. In that case, sum.hour -= 24
would yield the correct result.