28
CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak www.cs.sjsu.edu /~mak

CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

Embed Size (px)

Citation preview

Page 1: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

CS 151: Object-Oriented DesignSeptember 26 Class Meeting

Department of Computer ScienceSan Jose State University

Fall 2013Instructor: Ron Mak

www.cs.sjsu.edu/~mak

Page 2: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

2

Assignment #2 Review

What are the primary classes?

GameController

HumanPlayer

ComputerPlayer

• Typed in after a prompt• Graphical user interface (press the rock, paper, or scissors button)

• Randomly• Smart algorithm• etc.

Can vary.Must encapsulate!

Ways to input

the humanplayer’s throw

Ways to calculate

the computerplayer’s throw

Page 3: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

3

Assignment #2 Review

Encapsulate calculating the computer’s throw.

ThrowCalculator

calculateThrow(): Throw

ComputerPlayer

RandomThrow

calculateThrow(): Throw

SmartThrow

calculateThrow(): Throw

GeniusThrow

calculateThrow(): Throw

Abstract superclassCalendar

GregorianCalendar

LunarCalendar

Recall:

Page 4: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

4

Assignment #2 Review

Preserve your design flexibility! What’s wrong with this code?

RandomThrow randomThrow = new RandomThrow(...);

Throw t = randomThrow.calculateThrow(...);

Use the Factory Method Design Pattern and code to the interface.

ThrowCalculator calc =

ThrowCalculator.makeCalculator(type, ...);

Throw t = calc.calculateThrow(...);

ThrowCalculator

calculateThrow(): Throw

ComputerPlayer

RandomThrow

calculateThrow(): Throw

In this example, coding to the interface means coding to the superclass ThrowCalculator.

Page 5: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

5

Quiz #22013Sept26

Page 6: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

6

Feed Our Pets

Suppose you have an array animals of animal objects:

Animal

Mammal Fish Bird

Lion Dog Piranha Goldfish Parrot Hummingbird

«interface»HouseholdPet

«interface»Biter

Animal animals[];

Page 7: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

7

Feed Our Pets

Recall the definition of interface HouseholdPet:

How we find and feed all our pets that are in array animals?

public interface HouseholdPet{ void feed(Food f);}

for (int i = 0; i < animals.length; i++) { if ((animals[i] != null) && (animals[i] instanceof HouseholdPet)) { HouseholdPet pet = (HouseholdPet) animals[i]; Food f = Food.make(pet); // factory method pet.feed(f); }}

Page 8: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

8

Feed Our Pets

Instead of:

you can write:

HouseholdPet pet = (HouseholdPet) animals[i];pet.feed(f);

((HouseholdPet) animals[i]).feed(f);

The first way may be easier to write and read!_

Page 9: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

9

Marker Interfaces

What if an interface type doesn’t declare anything? Suppose

public interface Biter{ // nothing!}

A marker interface is an empty interface that serves to “tag” the classes that implement it.

Use the instanceof operator to see which objects are from a tagged class._

Page 10: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

10

Avoid Biters!

Example of how to use a marker interface:

for (int i = 0; i < animals.length; i++) { if ((animals[i] != null) && (animals[i] instanceof Biter)) { // Code that does something // with animals that are biters. // // The code doesn’t call any // Biter methods (because // there aren’t any). }}

Animal animals[];

Page 11: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

11

Polymorphism

The code of method showMessageDialog() needs the width of the icon that was passed in as a parameter. Interface Icon declares a getIconWidth() method.

public static void showMessageDialog(Component parent, Object message, String title, int messageType, Icon anIcon)

public interface Icon{ int getIconWidth(); int getIconHeight(); void paintIcon(Component c, Graphics g, int x, int y);}

Page 12: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

12

Polymorphism

Any object passed as the anIcon parameter be must be instantiated from a class that implements the Icon interface. Method showMessageDialog() doesn’t care whether the

parameter is an instance of ImageIcon or MarsIcon, or any other object, as long as the object was instantiated from a class that implements the Icon interface.

Method showMessageDialog() calls method getIconWidth() on the parameter. Implementations of method getIconWidth() may all be different

with nothing in common other than the name and return type.

public static void showMessageDialog(Component parent, Object message, String title, int messageType, Icon anIcon)

Page 13: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

13

Polymorphism

The feed() method of class Dog and the feed() method of class Goldfish may have very different implementations.

public interface HouseholdPet{ void feed(Food f);}

public class Dog extends Mammal implements HouseholdPet{ public void feed(Food f) { // code to feed a dog } ...}

public class Goldfish extends Fish implements HouseholdPet{ public void feed(Food f) { // code to feed a goldfish } ...}

Recall our interface HouseholdPet.

Page 14: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

14

Polymorphism

Even though the feed() method of each HouseholdPet object may be different, we can call each feed() method the same way. Our code is flexible: It doesn’t matter which Animal it is,

as long as it’s a HouseholdPet.

for (int i = 0; i < animals.length; i++) { if ((animals[i] != null) && (animals[i] instanceof HouseholdPet)) { HouseholdPet pet = (HouseholdPet) animals[i]; Food f = Food.make(pet); // factory method pet.feed(f); }}

Page 15: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

15

Polymorphism

Polymorphism: The ability to appear in many forms.

In Java, polymorphism is

The ability of a variable to automatically change behavior according to what object it refers to.

The ability to automatically select the appropriate method Mfor a particular object, when there are multiple objects of different classes that

all implement an interface that declares method M. there are multiple objects of different subclasses of a

superclass that declares method M._

Page 16: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

16

Advantages of Polymorphism

Loose coupling Class JOptionPane uses the Icon interface but is decoupled

from the MarsIcon or the ImageIcon classes.

Extensibility You can develop new types of icon objects,

as long as their classes implement the Icon interface.

Page 17: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

17

The Comparable Interface Type

The Java Collections class has a static sort() method that can sort any array list:

The list can contain objects of an arbitrary class, such as Animal.

How can the sort() method sort the list? How can it determine whether one object in the list is greater

than, less than, or equal to another object?

Answer: The class of the objects in the list must implement the Comparable interface.

Collections.sort(list);

ArrayList<Animal> aList;

Page 18: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

18

The Comparable Interface Type, cont’d

Suppose class Animal implements interface Comparable:

public interface Comparable<T>{ int compareTo(T other);}

public class Animal implements Comparable<Animal>{ ...}

Page 19: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

19

The Comparable Interface Type, cont’d

Now class Animal must implement the interface’s compareTo() method.

The call object1.compareTo(object2) is expected to return: a negative value if object1 should come before object2 0 if both object1 and object2 are equal a positive value if object1 should come after object2

public interface Comparable<T>{ int compareTo(T other);}

Page 20: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

20

The Comparable Interface Type, cont’d

Let’s compare animals by their weights:public class Animal implements Comparable<Animal>{ int weight; int height;

public int compareTo(Animal other) { if (weight < other.weight) return -1; if (weight > other.weight) return +1; return 0; } ...}

Of course, all the animal subclasses inherit the weight field and the compareTo() method.

Page 21: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

21

The Comparator Interface Type

Suppose we might want to compare not just by the animal’s weights, but also by their heights, or perhaps by some other field. So the comparison method can vary!

Therefore, we must ... ??

A second form of method Collections.sort() takes two parameters:1. the array list to sort

2. an object of a class that implements the Comparator interface

public interface Comparator<T>{ int compare(T first, T second);}

Page 22: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

22

The Comparator Interface Type

To sort an Animal array list aList by height:

public class AnimalComparatorByHeight implements Comparator<Animal>{ public int compare(Animal animal1, Animal animal2) { if (animal1.height < animal2.height) return -1; if (animal1.height > animal2.height) return +1; return 0; }}

Comparator<Animal> comp = new AnimalComparatorByHeight();Collections.sort(aList, comp);

Page 23: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

23

The Comparator Interface Type

Let the sort be ascending or descending:

public class AnimalComparatorByHeight implements Comparator<Animal>{ private int dir;

public AnimalComparatorByHeight(boolean ascending) { dir = ascending ? 1 : -1; }

public int compare(Animal animal1, Animal animal2) { if (animal1.height < animal2.height) return -1*dir; if (animal1.height > animal2.height) return +1*dir; return 0; }}

Page 24: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

24

The Comparator Interface Type

Now to sort the Animal array list aList in descending order:

Comparator<Animal> comp = new AnimalComparatorByHeight(false);Collections.sort(aList, comp);

We can shorten the above code. Variable comp really isn’t necessary if we don’t use it again.

Collections.sort(aList, new AnimalComparatorByHeight(false));

ArrayList<Animal> aList;

Page 25: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

25

Anonymous Classes

public class AnimalComparatorByHeight implements Comparator<Animal>{ public int compare(Animal animal1, Animal animal2) { if (animal1.height < animal2.height) return -1; if (animal1.height > animal2.height) return +1; return 0; }}

Comparator<Animal> comp = new AnimalComparatorByHeight();Collections.sort(aList, comp);

Page 26: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

26

Anonymous Classes

Notice that in our program, after we declare class AnimalComparatorByHeight, we use the class in only one statement:

Comparator<Animal> comp = new AnimalComparatorByHeight();

We can shorten our code even further by not giving the class a name in a separate class definition. Define the body of the class only when it’s used. Make it an anonymous class.

_

Page 27: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

27

Anonymous Classes

Comparator<Animal> comp = new Comparator<Animal>() { public int compare(Animal animal1, Animal animal2) { if (animal1.height < animal2.height) return -1; if (animal1.height > animal2.height) return +1; return 0; } };

Collections.sort(aList, comp);

Interface that the class implements

Note the semicolon

Comparator<Animal> comp = new AnimalComparatorByHeight();Collections.sort(aList, comp);

Page 28: CS 151: Object-Oriented Design September 26 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak mak

SJSU Dept. of Computer ScienceFall 2013: September 26

CS 151: Object-Oriented Design© R. Mak

28

Anonymous Classes

We can even get rid of variable comp:

Collections.sort(aList, new Comparator<Animal>() { public int compare(Animal animal1, Animal animal2) { if (animal1.height < animal2.height) return -1; if (animal1.height > animal2.height) return +1; return 0; } });

Note the closing parenthesis

Collections.sort(aList, comp);