Suppose the Car
class needs to be used in a simulation of New York City traffic in which
each actual car on the street is represented by one Car
object. That's a lot of cars. As currently written each car object
occupies approximately 60 bytes of memory (depending mostly on the size of
the license plate string. We can knock off eight bytes per car by using
floats instead of doubles, but the interface can stay the same:
public class Car {
private String licensePlate; // e.g. "New York A456 324"
private float speed; // kilometers per hour
private float maxSpeed; // kilometers per hour
public Car(String licensePlate, double maxSpeed) {
this.licensePlate = licensePlate;
this.speed = 0.0F;
if (maxSpeed >= 0.0) {
this.maxSpeed = (float) maxSpeed;
}
else {
maxSpeed = 0.0F;
}
}
// getter (accessor) methods
public String getLicensePlate() {
return this.licensePlate;
}
public double getSpeed() {
return this.speed;
}
public double getMaxSpeed() {
return this.maxSpeed;
}
// setter method for the license plate property
public void setLicensePlate(String licensePlate) {
this.licensePlate = licensePlate;
}
// accelerate to maximum speed
// put the pedal to the metal
public void floorIt() {
this.speed = this.maxSpeed;
}
public void accelerate(double deltaV) {
this.speed = this.speed + (float) deltaV;
if (this.speed > this.maxSpeed) {
this.speed = this.maxSpeed;
}
if (this.speed < 0.0) {
this.speed = 0.0F;
}
}
}
Since the interface is the same, no other classes that
depend on this class need to change or even be recompiled. We might save
even more by using a custom LicensePlate class that only
allowed one-byte ASCII characters instead of two byte Unicode characters.
|