Posts

Showing posts from May, 2013

How generics can be used in Class Factories

Lets see how generics can be used to create generic interface for class factories. public class GenericFactory <E> { Class<E> thisClass=null; public GenericFactory (Class iclass) { this.thisClass = iclass; } public E createInstance() throws IllegalAccessException,InstantiationException{ return(E)this.thisClass.newInstance(); } } The <E> is a type token that signals that this class has a type set when instantiated. public class Myclass { void print() { System.out.println("Hellooo"); } } public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException { GenericFactory<Myclass> factory = new GenericFactory<Myclass>(Myclass.class); Myclass myclass= factory.createInstance(); myclass.print(); } } Output:-   Hellooo We can see that, it is not necessary to cast the object returned from the factory.createInstance().

When to use getClass() and instanceOf in Java

getClass() only gives equality if two objects belong to same class whereas instanceOf works for subtype also. If two objects of different classes are checked for equal, then we use instanceOf . But once you use instanceOf at some level in the class hierarchy everything below it must use instanceOf or you will violatate the symmetry clause of equals contract.  e.g. any list can be equal to any list as long they have same elements iun the same order. So any List implementation equals() method must do instanceOf and not getclass() and then compare. On the other hand, it only make sense for na instance of class X to be equal to another instance of class X ( and not any subclass ) , then use getClass().