Agenda GenericsCompile-time type safety for collections without casting Enhanced for loopAutomates use of Iterators to avoid errors Autoboxing/unboxingAvoids manual conversion between primitive types (such as int) and wrapper types (such as Integer) Typesafe enumsProvides all the well-known benefits of the Typesafe Enum pattern1
Generics - IntroTutorials : http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdfCompile-time type safety without casting.
Methods can be defined to operate on unknown types of Objects without using ‘Objects’ class. And no type casting is required.
Big advantage: collections are now type safe.2Example : ‘Generify ‘ your Java classes –public class Box<T> { private T t ; public void add(Tt ) { this.t = t; } public T get() { return t; } }How to use this :Box<Integer> integerBox = new Box<Integer>();	…	integerBox.add(new Integer(25)); //typesafe only Integers can be passed	Integer myInt = integerBox.get() //no typecasting requiredT is a type parameter that will be replaced by a real type.T is the name of a type parameter.This name is used as a placeholder for the actual type that will be passed to Gen when an object is created.
Generics – Example 23Another Example public class GenericFactory<E> { Class theClass = null; public GenericFactory(Class theClass) { this.theClass = theClass; } public E createInstance() throws …{ return (E) this.theClass.newInstance(); }Usage : Creates a Factory of Generic TypeGenericFactory<MyClass> factory = new GenericFactory<MyClass>(MyClass.class);MyClass myClassInstance = factory.createInstance();
Generics – Generics in Methods4static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); } } static <T> Collection<T> fromArrayToCollectionv2(T[] a) { Collection<T> c = new ArrayList<T>(); for (T o : a) { c.add(o); } return c ; }One more Interesting Example…public <T> T ifThenElse(boolean b, T first, T second) {	return b ? first : second; }
Generics – With Collections5ListsList<String> list = new ArrayList<String>(); list.add(“A String”); String string2 = list.get(0); // no type casting.Maps (can define multiple typed parameters)	Map<String, String> map = new HashMap<String, String>();map.put ("key1", "value1");map.put ("key2", "value2");String value1 = map.get("key1");Iterating a Generic List:List<String> list = new ArrayList<String>(); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ String aString = iterator.next(); }Backward Compatibility	List list = new ArrayList<String>(); Nested Generic Types	List<List<String>> myListOfListsOfStrings;
Generics – Diving Deeper6Generics and SubtypingList<String> ls = new ArrayList<String>(); List<Object> lo = ls; //illegal won’t compile!!What’s the Problem ?lo.add(new Object()); String s = ls.get(0); // attempts to assign an Object to a String!In other words Collection<Object> is not a supertype of all the types of collectionsTo cope with this sort of situation use Wildcardsstatic void printCollection2(Collection<?> c) { // Collection<?> -“collection of unknown” for (Object e : c) { System.out.println(e); } }Limitation in using unbounded wildcardAny method that takes Generic type of argument cannot be invoked :Collection<?> c = new ArrayList<String>();c.add(new Object()); // compile time error
Generics – Subtyping continued…7Bounded WildcardsList<? extends Shape> is an example of a bounded wildcard.A wildcard with an upper bound looks like " ? extends Type “
A wildcard with a lower bound looks like " ? super Type " Example :public class Collections { public static <T> void copy ( List<? super T> dest, List<? extends T> src) { // uses bounded wildcards for (int i=0; i<src.size(); i++) dest.set(i,src.get(i)); } }List<Object> output = new ArrayList< Object >(); List<Long>    input = new ArrayList< Long >(); ... Collections.copy(output,input);  // fineList<String> output = new ArrayList< String >(); List<Long>    input = new ArrayList< Long >(); ... Collections.copy(output,input);  // error 
Enhanced for-loop or for each loop8New syntax of for loop that works for Collections and Arrays - Collections :void cancelAll(Collection<TimerTask> c) { for (TimerTask t : c) {	t.cancel();	} }Arrays :int sum(int[] a) {	int result = 0; for (int i : a) {	result += i;	}	return result; }Nested –for (Suit suit : suits) {	for (Rank rank : ranks){	sortedDeck.add(new Card(suit, rank));	}} No need to use iterators. (The compiler does this for you behind your back)
 The for-each construct gets rid of the clutter and the opportunity for error.Autoboxing9primitive types to be converted into respective wrapper objects and vice versa.(by the Compiler)int i; Integer j; j = 2; // int to Integer automatic conversioni = j; // Integer.intValue() callj = i; // int to Integer automatic conversionAdvantages : 1. Since Wrapper classes are immutable intObject = new Integer(10); Before Java 5 int intPrimitive = intObject.intValue(); intPrimitive++; intObject = new Integer(intPrimitive); Java 5 AutoBoxingintObject++;2. Easy to use wrapper classes within Collections ArrayList<Integer> list = new ArrayList<Integer>(); for(int i = 0; i < 10; i++)	list.add(i); // Boxing
Enum - Introduction10Java Constants Before JDK 1.5 –public static final int SEASON_WINTER = 0; public static final int SEASON_SPRING = 1; ……Issues:Not Type-safe Since season is represented as integer one can pass any integer values, without any compiler warnings.No Name space one may need to refer to java-docs (if any) to check the possible values in case more than one type of constants are declared in a single interface/class. Compile time binding Print Values not self explanatory.JDK 1.5 gets linguistic support for enumerated types as follows :enum Season { WINTER, SPRING, SUMMER, FALL }** Don’t confuse enum with the Enumeration interface, an almost obsolete way of iterating over Collections, replaced by Iterator.
Enum - Example11How to define them ..public enum Flavor { CHOCOLATE(100), //declare all the possible values first. VANILLA(120), STRAWBERRY(80); private int fCalories; // can have state (member variables) int getCalories(){ // cusotm method return fCalories; } private Flavor(int aCalories){ // constructor fCalories = aCalories; } }How to use them …String getColor(Flavor flv){ // Used as normal java objects..	if(flv == Flavor.VANILLA) // “==“ can be used for value comparison	return “White” ;	…….	switch(flv) {	case VANILLA : // You can use enums as case labels	……}String color = getColor(Flavor.VANILLA) // no constructor only constant values.

Java New Programming Features

  • 1.
    Agenda GenericsCompile-time typesafety for collections without casting Enhanced for loopAutomates use of Iterators to avoid errors Autoboxing/unboxingAvoids manual conversion between primitive types (such as int) and wrapper types (such as Integer) Typesafe enumsProvides all the well-known benefits of the Typesafe Enum pattern1
  • 2.
    Generics - IntroTutorials: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdfCompile-time type safety without casting.
  • 3.
    Methods can bedefined to operate on unknown types of Objects without using ‘Objects’ class. And no type casting is required.
  • 4.
    Big advantage: collectionsare now type safe.2Example : ‘Generify ‘ your Java classes –public class Box<T> { private T t ; public void add(Tt ) { this.t = t; } public T get() { return t; } }How to use this :Box<Integer> integerBox = new Box<Integer>(); … integerBox.add(new Integer(25)); //typesafe only Integers can be passed Integer myInt = integerBox.get() //no typecasting requiredT is a type parameter that will be replaced by a real type.T is the name of a type parameter.This name is used as a placeholder for the actual type that will be passed to Gen when an object is created.
  • 5.
    Generics – Example23Another Example public class GenericFactory<E> { Class theClass = null; public GenericFactory(Class theClass) { this.theClass = theClass; } public E createInstance() throws …{ return (E) this.theClass.newInstance(); }Usage : Creates a Factory of Generic TypeGenericFactory<MyClass> factory = new GenericFactory<MyClass>(MyClass.class);MyClass myClassInstance = factory.createInstance();
  • 6.
    Generics – Genericsin Methods4static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); } } static <T> Collection<T> fromArrayToCollectionv2(T[] a) { Collection<T> c = new ArrayList<T>(); for (T o : a) { c.add(o); } return c ; }One more Interesting Example…public <T> T ifThenElse(boolean b, T first, T second) { return b ? first : second; }
  • 7.
    Generics – WithCollections5ListsList<String> list = new ArrayList<String>(); list.add(“A String”); String string2 = list.get(0); // no type casting.Maps (can define multiple typed parameters) Map<String, String> map = new HashMap<String, String>();map.put ("key1", "value1");map.put ("key2", "value2");String value1 = map.get("key1");Iterating a Generic List:List<String> list = new ArrayList<String>(); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ String aString = iterator.next(); }Backward Compatibility List list = new ArrayList<String>(); Nested Generic Types List<List<String>> myListOfListsOfStrings;
  • 8.
    Generics – DivingDeeper6Generics and SubtypingList<String> ls = new ArrayList<String>(); List<Object> lo = ls; //illegal won’t compile!!What’s the Problem ?lo.add(new Object()); String s = ls.get(0); // attempts to assign an Object to a String!In other words Collection<Object> is not a supertype of all the types of collectionsTo cope with this sort of situation use Wildcardsstatic void printCollection2(Collection<?> c) { // Collection<?> -“collection of unknown” for (Object e : c) { System.out.println(e); } }Limitation in using unbounded wildcardAny method that takes Generic type of argument cannot be invoked :Collection<?> c = new ArrayList<String>();c.add(new Object()); // compile time error
  • 9.
    Generics – Subtypingcontinued…7Bounded WildcardsList<? extends Shape> is an example of a bounded wildcard.A wildcard with an upper bound looks like " ? extends Type “
  • 10.
    A wildcard witha lower bound looks like " ? super Type " Example :public class Collections { public static <T> void copy ( List<? super T> dest, List<? extends T> src) { // uses bounded wildcards for (int i=0; i<src.size(); i++) dest.set(i,src.get(i)); } }List<Object> output = new ArrayList< Object >(); List<Long>    input = new ArrayList< Long >(); ... Collections.copy(output,input);  // fineList<String> output = new ArrayList< String >(); List<Long>    input = new ArrayList< Long >(); ... Collections.copy(output,input);  // error 
  • 11.
    Enhanced for-loop orfor each loop8New syntax of for loop that works for Collections and Arrays - Collections :void cancelAll(Collection<TimerTask> c) { for (TimerTask t : c) { t.cancel(); } }Arrays :int sum(int[] a) { int result = 0; for (int i : a) { result += i; } return result; }Nested –for (Suit suit : suits) { for (Rank rank : ranks){ sortedDeck.add(new Card(suit, rank)); }} No need to use iterators. (The compiler does this for you behind your back)
  • 12.
    The for-eachconstruct gets rid of the clutter and the opportunity for error.Autoboxing9primitive types to be converted into respective wrapper objects and vice versa.(by the Compiler)int i; Integer j; j = 2; // int to Integer automatic conversioni = j; // Integer.intValue() callj = i; // int to Integer automatic conversionAdvantages : 1. Since Wrapper classes are immutable intObject = new Integer(10); Before Java 5 int intPrimitive = intObject.intValue(); intPrimitive++; intObject = new Integer(intPrimitive); Java 5 AutoBoxingintObject++;2. Easy to use wrapper classes within Collections ArrayList<Integer> list = new ArrayList<Integer>(); for(int i = 0; i < 10; i++) list.add(i); // Boxing
  • 13.
    Enum - Introduction10JavaConstants Before JDK 1.5 –public static final int SEASON_WINTER = 0; public static final int SEASON_SPRING = 1; ……Issues:Not Type-safe Since season is represented as integer one can pass any integer values, without any compiler warnings.No Name space one may need to refer to java-docs (if any) to check the possible values in case more than one type of constants are declared in a single interface/class. Compile time binding Print Values not self explanatory.JDK 1.5 gets linguistic support for enumerated types as follows :enum Season { WINTER, SPRING, SUMMER, FALL }** Don’t confuse enum with the Enumeration interface, an almost obsolete way of iterating over Collections, replaced by Iterator.
  • 14.
    Enum - Example11Howto define them ..public enum Flavor { CHOCOLATE(100), //declare all the possible values first. VANILLA(120), STRAWBERRY(80); private int fCalories; // can have state (member variables) int getCalories(){ // cusotm method return fCalories; } private Flavor(int aCalories){ // constructor fCalories = aCalories; } }How to use them …String getColor(Flavor flv){ // Used as normal java objects.. if(flv == Flavor.VANILLA) // “==“ can be used for value comparison return “White” ; ……. switch(flv) { case VANILLA : // You can use enums as case labels ……}String color = getColor(Flavor.VANILLA) // no constructor only constant values.
  • 15.
    Enum 12Facts aboutenmus :Enums can nave methods, constructors , static and member variables, static block etc..like other java classes.
  • 16.
    These canbe passed around as Java objects.
  • 17.
    Constructors arenever invoked outside the Enums (no new operator)
  • 18.
    Enums areimplicitly final subclasses of java.lang.Enum
  • 19.
    equals() and == amount to thesame thing.Advantages -You can use enums as case labels.
  • 20.
    Methods come builtin with enums to do do things like convert enums names to ordinals, and combos with enumset.
  • 21.
    You can attachadditional fields and code to enum constants.
  • 22.
    enums are typesafe. With Strings all your items in all categories are the same type. There is nothing to stop you from feeding a fruit category to an animal parameter.
  • 23.
    You can compareenums quickly with ==. You don’t need to use equals as you do with String.Varargs and Static import13Arbitrary number of arguments can be passed using varargs.public static String format(String pattern, Object... arguments){ …..}Here we can pass –format( "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.", 7, new Date(), “abcd");We can also pass an array of objects.Varargs can be used only in the final argument positionStatic Importimport static java.lang.Math.PI;….double r = cos(PI * theta);Advantage :No need to refer same class/package more than one timeDisadvantage :Name space is lost. Makes code unmaintainable, Don’t overuse this.
  • 24.