Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Polymorphic call

I am new to java, I have seen in the code at many places where my seniors have declared as

List myList = new ArrayList(); (option1)

Instead of

ArrayList myList = new ArrayList(); (option2)

Can you please tell me why people use Option1, is there any advantages?

If we use option2, do we miss out any advantages or features?

like image 771
gmhk Avatar asked Mar 16 '10 03:03

gmhk


People also ask

What is a polymorphic call?

In object-oriented languages, like Smalltalk, polymorphic calls are known as message sends and polymorphic call resolution is called message dispatch. The different class-specific implementations of a message are called methods. Implementation inheritance allows default methods to be defined for sets of classes.

What is polymorphic call PHP?

Polymorphism in OOPs is a concept that allows you to create classes with different functionalities in a single interface. Generally, it is of two types: compile-time (overloading) and run time (overriding), but polymorphism in PHP does not support overloading, or in other words, compile-time polymorphism.


2 Answers

Option 1 is considered programming to an interface, where option 2 is programming to an implementation. The latter is sometimes necessary, but the former provides you with the ability to easily switch implementations by ensuring that you don't depend on methods provided by a particular implementation.

Furthermore, if you create methods that need only the functionality provided by an interface then they should be declared as requiring the interface so that any object implementing the interface can be passed to them. Doing so broadens the scope for re-use of the API. For example:

// This can be called passing any List
public int countItems(List lst, Filter flt) {
    // iterate list, apply filter, and count matching objects
    }

// This can called passing only an ArrayList, an unnecessary limitation in this case
public int countItems(ArrayList lst, Filter flt) {
    // iterate list, apply filter, and count matching objects
    }

That said, for some interfaces, there are hidden implementation dependent traps (at least in Java). An example of this in List.get(int); if you have an ArrayList this is efficient, but for a LinkedList it is not. If the list is very large the difference can be dramatic, esp for a poorly conceived construct like this loop:

for(int xa=0,len=list.length; xa<len; xa++) {
    Object obj=list.get(xa);
    obj.doSomething();
    }

which has terrible performance for large linked lists since the list must be traversed from the beginning for every get(xa).

like image 133
Lawrence Dol Avatar answered Sep 23 '22 16:09

Lawrence Dol


The advantage of using option1, ie, List myList = new ArrayList(); is to have polymorphic behaviour with respect to methods. Say, for example, you can have a method which takes arguments of type List,

someMethod(List lst)
{
   lst.doSomething();
   //do somethng else.....
}

In this method lst can be of type Linked List, ArrayList or CopyOnWriteArrayList.

like image 22
Zaki Avatar answered Sep 23 '22 16:09

Zaki