910 likes | 1.03k Views
CISC121 – Lecture 5. Last time: Method Overloading Arrays A few useful classes in Java: System Wrapper classes String class StringTokenizer ArrayList<T>. You Should Be:. Getting your assn 1 marks soon. Nearly finished Exercise 2. You Will Need To:. Finish Assn 2 by Thursday. Today.
E N D
CISC121 – Lecture 5 • Last time: • Method Overloading • Arrays • A few useful classes in Java: • System • Wrapper classes • String class • StringTokenizer • ArrayList<T> CISC121 - Prof. McLeod
You Should Be: • Getting your assn 1 marks soon. • Nearly finished Exercise 2. CISC121 - Prof. McLeod
You Will Need To: • Finish Assn 2 by Thursday. CISC121 - Prof. McLeod
Today • Encapsulation • Javadoc • Testing and Debugging (some slides for reading?) CISC121 - Prof. McLeod
Encapsulation • An OOP programming technique that: • Supports the re-usability of code. • Provides a well-defined user interface. • Builds into an Object the code that ensures the integrity of the data stored in the Object by: • Making sure that initial data values are “legal”. • Controlling (or preventing) changes to data. • Preventing “privacy leaks” when data is returned out of an Object. • Works well with modular design practices making code easier to write, test and debug. CISC121 - Prof. McLeod
Encapsulation, Cont. • This is the driving principle for the design of all Objects in the Java API! • So, maybe you should design your own Objects using the same principle? Your class Java API CISC121 - Prof. McLeod
An Example • Suppose you want to create a database to store records of Halloween visits. • For each year, you wish to record: • Number of munchkins banging at your door. • Outdoor temperature in deg C. • Weather condition – “rain”, “snow”, or “clear”. • You could create three arrays for each of the fields. • Difficult to code when moving records around… CISC121 - Prof. McLeod
An Example, Cont. • It would be easier to create an Object that contains these three fields and then design a collection of these Objects. • No way the fields could get out of order since moving a record moves all fields at once. • The collection could be an array, an ArrayList or some other structure. • So, how to design an Object to hold this information? CISC121 - Prof. McLeod
Halloween1 publicclass Halloween1 { publicint numMunchkins; publicint temperature; public String weatherCondition; } // end Halloween1 CISC121 - Prof. McLeod
Halloween1, Cont. • In the main method in some other class: Halloween1[] hwDB = new Halloween1[100]; hwDB[0] = new Halloween1(); hwDB[0].numMunchkins = 200; hwDB[0].temperature = 10; hwDB[0].weatherCondition = "rain"; CISC121 - Prof. McLeod
Halloween1, Cont. • Or with an ArrayList<T>: ArrayList<Halloween1> hwDBA = new ArrayList<Halloween1>(); Halloween1 hw = new Halloween1(); hw.numMunchkins = 200; hw.temperature = 10; hw.weatherCondition = "rain"; hwDBA.add(hw); CISC121 - Prof. McLeod
Halloween1, Cont. • A question: Why not declare the attributes in Halloween1 static? CISC121 - Prof. McLeod
Halloween1, Cont. • Another question: What is wrong with the following?: hwDB[1] = new Halloween1(); hwDB[1].numMunchkins = -200; hwDB[1].temperature = 100; hwDB[1].weatherCondition = "frogs"; CISC121 - Prof. McLeod
Halloween1, Cont. • The object, hwDB[1] is not particularly realistic. • How can we prevent the creation of an object like this? • Who is responsible for checking for realistic, or “legal” values for the attributes? The Halloween1 class or the class that uses it? Where is it easiest to put these checks? CISC121 - Prof. McLeod
Encapsulation, Cont. • Attributes must be declared private, so that the class that owns them can control how they are set. • If attributes are private then how can a user of the class assign the values of the attributes? • Through methods, of course! • Constructor(s) • Mutator(s) CISC121 - Prof. McLeod
Encapsulation, Cont. • Within these methods, you can write code to check the parameters for validity. • What do you do if the values are not legal? Throw an exception! CISC121 - Prof. McLeod
Defining Exceptions • You can throw an exception already defined in java, but: • Most of the time you will want to throw your own exception objects. • Why not? It’s easy! • See the next slide for the definition of an Exception object. (Please ignore indentation and line wrapping…) CISC121 - Prof. McLeod
Defining Exceptions, Cont. public class IllegalHalloweenParametersException extends Exception { public IllegalHalloweenParametersException() { super("Illegal parameter value supplied to Halloween object."); } public IllegalHalloweenParametersException(String message) { super(message); } } // end IllegalHalloweenParametersException CISC121 - Prof. McLeod
Defining Exceptions, Cont. • Inside a method that detects an illegal parameter: throw new IllegalHalloweenParametersException("Illegal number of kids."); • At the end of the method header that contains the above line of code: … throws IllegalHalloweenParametersException { CISC121 - Prof. McLeod
Defining Exceptions, Cont. • This example contains a few Java keywords that we have not yet discussed: • extends • super • throw • throws • The exact meaning and usage of extends and super is beyond CISC121, but you can still write your own exceptions by following the provided pattern! CISC121 - Prof. McLeod
Assigning Private Attributes - Constructor Methods • Constructors are special methods that have the same name as the class in which they reside, but have no return type (not even void). • They must be public. • They are only executed once, when the object is being instantiated. You can’t invoke them later. • Constructors are often overloaded. This means you can have many constructors with different parameter lists. Why do that? CISC121 - Prof. McLeod
Halloween2 • Halloween2.java uses a constructor to set all parameters. • It also throws an exception if illegal values are encountered. • See how this object is used in TestHalloween2.java. • Note that this class is not complete – it only has the one constructor, for now. CISC121 - Prof. McLeod
Assigning Private Attributes - Constructor Methods, Cont. • Note that once you have written a constructor with parameters, you can no longer use a constructor without any parameters, called the default constructor. • If you want an empty constructor, you must write one yourself, in addition to the parameterized constructor(s). • Why would you want an empty constructor? CISC121 - Prof. McLeod
Assigning Private Attributes - Constructor Methods, Cont. • Suppose you don’t want to have to force the user to supply all parameters when he instantiates the object? How are you going to do this? • Suppose you want to edit parameters after you have created the object? How are you going to do this, too? Overload the constructors. Provide mutator(s). CISC121 - Prof. McLeod
Assigning Private Attributes - Mutator Methods • Called “set” methods – in fact, by convention, the word “set” is the first word in the method name. • These methods must also check for legal parameters. • Usually the constructor invokes mutators, when they exist. • Should you write a mutator for each parameter? CISC121 - Prof. McLeod
Halloween3 • Has overloaded constructors. • Has mutators. • A Halloween3 object can be created with or without the weather condition, but must have both the number of munchkins and the temperature. • All parameters can be changed later. • (Is still not yet complete…) CISC121 - Prof. McLeod
Halloween3, Cont. • Note how the constructor invokes the mutators. • Mutators and constructors can throw the exception. • Note how the second, 2 parameter constructor uses the this keyword to invoke the three parameter constructor. • Note how the second constructor has to make an assumption for the value of weatherCondition (“unknown”). • Can you create an empty Halloween3 object? CISC121 - Prof. McLeod
Aside, The this Thing • Can be used to supply a reference to the current object in that object’s code. • this means “myself”. • (When you invoke a method inside the same class, the compiler adds an implicit this keyword to each of those invocations.) CISC121 - Prof. McLeod
Accessors • We have some useful ways to assign attributes, but how about getting them back out again? • Accessor methods return the value of an attribute. • By convention, accessor methods start with the word “get”. • One accessor per attribute. • For example: publicint getNumMunckins () { return numMunchkins; } // end getNumMunchkins Accessor CISC121 - Prof. McLeod
Accessors, Cont. • These are pretty simple methods. • Except when you are returning an object. • Suppose we measured the temperature every hour and stored the values in an array of int[] called hourlyTemps. • What is wrong with the following? public int[] getHourlyTemps { return hourlyTemps; } // end getHourlyTemps Accessor CISC121 - Prof. McLeod
Accessors, Privacy Leaks • Could the method receiving the pointer to the array hourlyTemps change the contents of the array? • How else can you do this? CISC121 - Prof. McLeod
Accessors, Privacy Leaks, Cont. public int[] getHourlyTemps { int[] temp = new int[hourlyTemps.length]; for (int i = 0; i < hourlyTemps.length; i++) temp[i] = hourlyTemps[i]; return temp; } // end getHourlyTemps Accessor CISC121 - Prof. McLeod
Accessors, Privacy Leaks, Cont. • Or: public int[] getHourlyTemps { return hourlyTemps.clone(); } // end getHourlyTemps Accessor • clone() is the only method that an array has. • It creates a deep (or non-aliased) copy of an array. • Either of these methods would prevent privacy leaks. CISC121 - Prof. McLeod
Other Standard Methods • toString() • equals() • compareTo() • clone() • These are all properly coded in the, now complete, Halloween4 class. • It also contains Javadoc comments, which you can ignore for now. CISC121 - Prof. McLeod
toString() Method • As it is, if we try to print a Halloween object, we will just get “gobbldeygook”: Halloween2@923e30 • (This String is composed of the object type and its hash code…) • So, to get a more useful view of the contents of the object, define a toString() method that returns a String. CISC121 - Prof. McLeod
toString() Method, Cont. • This method will be called automatically whenever a String version of the object is needed. • (It overrides the toString() method from the parent Object class…) • You decide on how you want to represent your object as a String. • See the method in Halloween4, for example: CISC121 - Prof. McLeod
In Halloween4: public String toString () { String s = numMunchkins + " kids, "; s += temperature + " deg C. and "; s += weatherCondition + "."; return s; } // end toString CISC121 - Prof. McLeod
In TestHalloween4 • For example, the code: System.out.println(hwDB[0]); • Would print out: 200 kids, 10 deg C. and clear. • Note that you don’t need an explicit toString() call (but you can, if you want). CISC121 - Prof. McLeod
equals() Method • Accepts another object of type Halloween4 and returns true of they are equal, false otherwise. • You get to define what “equality” means. • (Usually all the attributes have to match.) • Remember why you cannot use == to compare objects? CISC121 - Prof. McLeod
equals() Method, Cont. • Two ways to write an equals() method (both will return true or false): • Accept a Halloween4 object as a parameter. • Accept an Object as a parameter (Object is the base class for all objects in Java!) • The proper way is the second one – then you will overwrite the equals() method inherited from the base, Object class (just take my word for this!). • (Outside the scope of CISC121, again…) CISC121 - Prof. McLeod
equals() Method, Cont. publicboolean equals (Object otherObject) { if (otherObject instanceof Halloween4) { Halloween4 otherH = (Halloween4)otherObject; return numMunchkins == otherH.numMunchkins && temperature == otherH.temperature && weatherCondition.equalsIgnoreCase (otherH.weatherCondition); } // end if returnfalse; } // end equals CISC121 - Prof. McLeod
equals() Method, Cont. • The instanceofkeyword checks to see if the supplied Object is indeed a Halloween4 object before it attempts to cast it. • Treat this code like the code you saw for the Exception class – follow the formula, and it will work! CISC121 - Prof. McLeod
compareTo() Method • Compares a supplied Halloween4 object with the current one, based on your comparison criteria. • It returns an int value. • (Like the compareTo() method in the String class.) • You have to decide on the basis for comparison. • For Halloween4 you could just use numMunchkins, for example. CISC121 - Prof. McLeod
compareTo() Method, Cont. • The base Object class does not have this method, so you don’t have to worry about writing one to take an Object as a parameter. CISC121 - Prof. McLeod
clone() Method • Returns a deep copy of the current object. • Pretty easy for our Halloween4 object since it only stores primitive types and an immutable object. • See Halloween4.java for a complete version of the Halloween object! CISC121 - Prof. McLeod
Javadoc • Javadoc.exe is a program that comes with the JDK. (It is in the same directory as javac.exe and java.exe). • If I have written a class, “MyClass.java”, that contains properly formatted comments (more below), then running “javadoc MyClass.java” generates a file “MyClass.html”. • The html file contains external documentation generated from the formatted comments in the source code. CISC121 - Prof. McLeod
Javadoc - Cont. • Normal block comments in Java are delimited by “/*” and “*/”. Everything between these delimiters, usually multiple lines, is a comment. • Javadoc block comments are delimited by “/**” and “*/”. CISC121 - Prof. McLeod
Javadoc - Cont. • The general form of a Javadoc comment: /** * Summary sentence. * More general information about the * class, attribute or method which * follows the comment, using as many lines * as necessary. (html tags can be included) * * javadoc tags to specify more specific * information, such as parameters and * return values for a method */ CISC121 - Prof. McLeod
Javadoc - Cont. • The general form of a Javadoc tag is: @tagNamecomment • The tags you use depend on what you are describing (class, method or attribute). • In the case of methods, you can have a tag for each parameter, the return value, and a tag for each thrown exception. • Eclipse (really nice!!) will generate a blank tag for you after you type “/**”. • Typically, you will only write javadoc comments for public attributes and methods… CISC121 - Prof. McLeod
Common Javadoc Tags CISC121 - Prof. McLeod