
public class DataSet // Modified for BankAccount objects
{
private double sum;
private BankAccount maximum;
private int count;
. . .
public void add(BankAccount x)
{
sum = sum + x.getBalance();
if (count == 0 || maximum.getBalance() < x.getBalance())
maximum = x;
count++;
}
public BankAccount getMaximum()
{
return maximum;
}
}
public class DataSet // Modified for Coin objects
{
private double sum;
private Coin maximum;
private int count;
. . .
public void add(Coin x)
{
sum = sum + x.getValue();
if (count == 0 || maximum.getValue() < x.getValue())
maximum = x;
count++;
}
public Coin getMaximum()
{
return maximum;
}
}
sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x; count++;
public interface Measurable
{
double getMeasure();
}
public class DataSet
{
private double sum;
private Measurable maximum;
private int count;
. . .
public void add(Measurable x)
{
sum = sum + x.getMeasure();
if (count == 0 || maximum.getMeasure() < x.getMeasure())
maximum = x;
count++;
}
public Measurable getMaximum()
{
return maximum;
}
}
public class BankAccount implements Measurable { ... public double getMeasure() { return balance; } }
public class Coin implements Measurable { public double getMeasure() { return value; } . . . }
stereotypeindicator «interface»
is-arelationship between a class and an interface
usesrelationship or dependency
Average balance: 4000.0 Expected: 4000 Highest balance: 10000.0 Expected: 10000 Average coin value: 0.13333333333333333 Expected: 0.133 Highest coin value: 0.25 Expected: 0.25
BankAccount account = new BankAccount(10000); Measurable meas = account; // OK
Coin dime = new Coin(0.1, "dime"); Measurable meas = dime; // Also OK
Measurable meas = new Rectangle(5, 10, 20, 30); // ERRORBecause Rectangle doesn't implement Measurable
DataSet coinData = new DataSet(); coinData.add(new Coin(0.25, "quarter")); coinData.add(new Coin(0.1, "dime")); coinData.add(new Coin(0.05, "nickel")); Measurable max = coinData.getMaximum(); // Get the largest coin
String name = max.getName(); // ERROR
Coin maxCoin = (Coin) max;
String name = maxCoin.getName();
Measurable meas; meas = new BankAccount(10000); meas = new Coin(0.1, "dime");Note that the object to which meas refers doesn't have type Measurable; the type of the object is some class that implements the Measurable interface
double m = meas.getMeasure();
DataSet data = new DataSet(); data.add(new BankAccount(1000)); data.add(new Coin(0.1, "dime")); System.out.println(data.getAverage());
public interface Measurer
{
double measure(Object anObject);
}
lowest common denominatorof all classes
public DataSet(Measurer aMeasurer)
{
sum = 0;
count = 0;
maximum = null;
measurer = aMeasurer; // Measurer instance variable
}
public void add(Object x)
{
sum = sum + measurer.measure(x);
if (count == 0 || measurer.measure(maximum) < measurer.measure(x))
maximum = x;
count++;
}
public class RectangleMeasurer implements Measurer
{
public double measure(Object anObject)
{
Rectangle aRectangle = (Rectangle) anObject;
double area = aRectangle.getWidth() * aRectangle.getHeight();
return area;
}
}
Rectangle aRectangle = (Rectangle) anObject;
Measurer m = new RectangleMeasurer(); DataSet data = new DataSet(m); data.add(new Rectangle(5, 10, 20, 30)); data.add(new Rectangle(10, 20, 30, 40)); . . .
Average area: 625 Expected: 625 Maximum area rectangle: java.awt.Rectangle[x=10,y=20,width=30,height=40] Expected: java.awt.Rectangle[x=10,y=20,width=30,height=40]
itself, that is, the implicit parameter.
public class DataSetTester3
{
public static void main(String[] args)
{
class RectangleMeasurer implements Measurer
{
. . .
}
Measurer m = new RectangleMeasurer();
DataSet data = new DataSet(m);
. . .
}
}
public class DataSetTester3
{
class RectangleMeasurer implements Measurer
{
. . .
}
public static void main(String[] args)
{
Measurer m = new RectangleMeasurer();
DataSet data = new DataSet(m);
. . .
}
}
DataSetTester$1$RectangleMeasurer.class
public void addScore(int studentId, double score) public double getAverageScore(int studentId) public void save(String filename)
public interface IGradeBook
{
void addScore(int studentId, double score);
double getAverageScore(int studentId);
void save(String filename);
. . .
}
public class MockGradeBook implements IGradeBook
{
private ArrayList<Double> scores;
public void addScore(int studentId, double score)
{
// Ignore studentId
scores.add(score);
}
double getAverageScore(int studentId)
{
double total = 0;
for (double x : scores) { total = total + x; }
return total / scores.size();
}
void save(String filename)
{
// Do nothing
}
. . .
}
public interface ActionListener
{
void actionPerformed(ActionEvent event);
}
ActionListener listener = new ClickListener(); button.addActionListener(listener);
JButton button = new JButton(". . .");
// This inner class is declared in the same method as the button variable
class MyListener implements ActionListener
{
. . .
};
ActionListener listener = new MyListener();
button.addActionListener(listener);
{ // Surrounding block
BankAccount account = new BankAccount();
if (. . .)
{ // Inner block
. . .
// OK to access variable from surrounding block
account.deposit(interest);
. . .
} // End of inner block
. . .
} // End of surrounding block
JButton button = new JButton("Add Interest");
final BankAccount account = new BankAccount(INITIAL_BALANCE);
// This inner class is declared in the same method as the account and button variables.
class AddInterestListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
// The listener method accesses the account variable
// from the surrounding block
double interest = account.getBalance() * INTEREST_RATE / 100;
account.deposit(interest);
}
};
ActionListener listener = new AddInterestListener();
button.addActionListener(listener);
balance: 1100.0 balance: 1210.0 balance: 1331.0 balance: 1464.1
JButton button = new JButton("Add Interest");
JLabel label = new JLabel("balance: " + account.getBalance());
JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel);
class AddInterestListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
double interest = account.getBalance() * INTEREST_RATE / 100;
account.deposit(interest);
label.setText("balance=" + account.getBalance());
}
}
class MyListener implements ActionListener
{
void actionPerformed(ActionEvent event)
{
Listener action (executed at each timer event)
}
}
MyListener listener = new MyListener(); Timer t = new Timer(interval, listener); t.start();
Displays a rectangle that can be moved
The repaint method causes a component to repaint itself. Call this method whenever you modify the shapes that the paintComponent method draws
public interface MouseListener
{
void mousePressed(MouseEvent event);
// Called when a mouse button has been pressed on a component
void mouseReleased(MouseEvent event);
// Called when a mouse button has been released on a component
void mouseClicked(MouseEvent event);
// Called when the mouse has been clicked on a component
void mouseEntered(MouseEvent event);
// Called when the mouse enters a component
void mouseExited(MouseEvent event);
// Called when the mouse exits a component
}
public class MyMouseListener implements MouseListener
{
// Implements five methods
}
MouseListener listener = new MyMouseListener();
component.addMouseListener(listener);
box.setLocation(x, y); repaint();
class MousePressListener implements MouseListener
{
public void mousePressed(MouseEvent event)
{
int x = event.getX();
int y = event.getY();
component.moveTo(x, y);
}
// Do-nothing methods
public void mouseReleased(MouseEvent event) {}
public void mouseClicked(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
}