Monday, January 17, 2011

When providing a user defined class to HashMap or HashTable what methods needs to be overridden?

You should override the equals() and hashCode() methods from the Object class. The default implementation of the equals() and hashcode(), which are inherited from the java.lang.Object uses an object instance’s memory location (e.g. MyEmployeeObject@8d52g38h). This can cause problems when two instances of the Employee objects have the
same id but the inherited equals() will return false because it uses the memory location, which is different for the two instances. Also the toString() method can be overridden to provide a proper string representation of your
object. Points to consider:

• If a class overrides equals(), it must override hashCode().
• If 2 objects are equal, then their hashCode values must be equal as well.
• If a field is not used in equals(), then it must not be used in hashCode().
• If it is accessed often, hashCode() is a candidate for caching to enhance performance.

Vector Vs ArrayList

Vectors are synchronized. Any method that touches the Vector's contents is thread safe. ArrayList, on the other hand, is unsynchronized, making them, therefore, not thread safe. With that difference in mind, using synchronization
will incur a performance hit. So if you don't need a thread-safe collection, use the ArrayList.


Data growth


Internally, both the ArrayList and Vector hold onto their contents using an Array. When you insert an element into an ArrayList or a Vector, the object will need to expand its internal array if it runs out of room. A Vector defaults to doubling the size of its array, while the ArrayList increases its array size by 50 percent. Depending on how you use these classes, you could end up taking a large performance
hit while adding new elements. It's always best to set the object's initial capacity to the largest capacity that your program
will need. By carefully setting the capacity, you can avoid paying the penalty needed to resize the internal array later.
If you don't know how much data you'll have, but you do know the rate at which it grows, Vector does possess a slight advantage since you can set the increment value.


Usage patterns


Both the ArrayList and Vector are good for retrieving elements from a specific position in the container or for adding and removing elements from the end
of the container. All of these operations can be performed in constant time -- O(1). However, adding and removing elements from any other position proves more expensive -- linear to be exact: O(n-i), where n is the number of elements and i is the index of the element added or removed. These operations are more expensive because you have to shift all elements
at index i and higher over by one element. So what does this all mean?


It means that if you want to index elements or add and remove elements at the end of the array, use either a Vector or an ArrayList. If you want to do anything else to the contents, go find yourself another container class. For example, the LinkedList can add or remove an element at any position in constant time -- O(1). However, indexing an element is a bit slower -- O(i) where i is the index of the element. Traversing an ArrayList is also easier since you can simply use an index instead of having to create an iterator. The LinkedList also creates an internal object for each element inserted. So you have to be aware of the extra garbage being created.

When to use an abstract class and interface

When to use an abstract class?:

In case where you want to use implementation inheritance then it is usually
provided by an abstract base class. Abstract classes let you define some default behaviour and force subclasses to provide any specific behaviour.

When to use an interface?: For polymorphic interface inheritance, where the client wants to only deal with a type and does not care about the actual implementation use interfaces. If you need to change your design frequently,

you should prefer using interface to abstract. Justification for using interfaces
is that they solve the ‘diamond problem’ of traditional multiple inheritance.

What is the difference between aggregation and composition?

Aggregation is an association in which one class belongs to a collection. This is a part of a whole relationship where a part can exist without a whole.

For example a line item is a whole and product is a part. If a line item is deleted then corresponding product need not be deleted. So aggregation has a weaker relationship.

Ex:

Class employee {

private Department dept;

//setter and getter methods
}

dept can exists even if we delete employee class.since dept can be a member of another class.

Composition is an association in which one class belongs to a collection. This is a part of a whole relationship where a part cannot exist without a whole. If a whole is deleted then all parts are deleted.

For example An order is a whole and line items are parts. If an order deleted then all corresponding line items for that order should be deleted. So composition has a stronger relationship.

Ex:

class Employee {

private Department dept = new Department();

}

If employee is deleted, department also deleted.

Difference between NoClassDefFoundException and ClassNotFoundException

A NoClassDefFoundException is thrown if a class is referenced with Java’s “new” operator (i.e. static loading) but the runtime system cannot find the referenced class.

Ex: Employee e = new Employee();


A ClassNotFoundException is thrown when an application tries to load in a
class through its string name using the following methods but no definition for the
class with the specified name could be found:

1. The forName(..) method in class - Class.
2. The findSystemClass(..) method in class - ClassLoader.
3. The loadClass(..) method in class - ClassLoader

Ex: Class employeeClass = Class.forName("com.samples.Employee") ;

Tuesday, September 21, 2010

Core J2EE Design Patterns

J2EE Design patterns are divided into 3 types

1. Presentation Tier
2. business Tier
3. Integration Tier


Presentation Tier Design Patterns

1. Front Controller
2. Service to workers
3. Dispatcher view
4. Composite View
5. View Helper
6. Intercepting Filter
7. Application Controller
8. Context Object pattern

Business Tier Design Patterns

1. Business Delegate
2. Service Locator
3. Session Façade
4. Application Service
5. Business Object
6. Message Façade
7. Transfer Object(Value Object)
8. Transfer Object Assembler
9. Value List Handler
10. Composite Entity

>Integration Tier Design Patterns

1. Service Activator pattern
2. Data Access Object (DAO)
3. Domain Store

Design Patterns

What is a design pattern
a practical, proven solution to a recurring design problem

Design patterns are divided into two types

GOF Design Patterns
Core J2EE patterns

GOF Design patterns:

Gang of four design patterns are divided into 3 trypes
1. Creational
2. Structural
3. Behavioral

Creational patterns are ones that create objects for you, rather than having you instantiate objects directly

Structural patterns help you compose groups of objects into larger structures

Behavioral patterns help you define the communication between objects in your system and how the flow is controlled in a complex program.

Creational Patterns:
Abstract Factory
Builder
Factory
Prototype
Singleton

Structural patterns:
adapter
bridge
composite
decorator
facade
flyweight
proxy

Behavioral patterns:
chain of responsibility
command
interpreter
iterator
mediator
memento
observer
state
strategy
template method
Visitor

Creational Patterns Types

Factory Method : define an interface for creating an object, but let sub-class decide which class to instantiate. This lets a class to defer instantiation to subclasses.

Builder : separate the construction of a complex object from its representation so that the same construction process can create diff. representations.

Abstract Factory : provide an interface for creating families of related or dependent objects without specifying their concrete classes.

Prototype : specify the kinds of objects to create using a prototypical instance and create new objects by copying this prototype.

Singleton : Ensure a class only has one instance, and provide a global point of access to it.

Structural Patterns Types:

Adapter : convert the interface of a class into another interface clients expect. Adapter lets classes work together that could not otherwise because of incompatible interfaces.

The Adapter pattern is used so that two unrelated interfaces can work together. The joining between them is called an Adapter

Bridge : Decouple an abstraction from its implementation so that the two can vary independently.

Composite : compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly

Decorator : Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to sub classing for extending functionality.

Façade : Provide a unified interface to a set of interfaces in a subsystem. Façade defines a higher level interface that makes the subsystem easier to use

Flyweight : use sharing to support large numbers of fine-grained objects efficiently.

Proxy : which provides a simple place-holder class for a more complex class which is expensive to instantiate.



Behavioral Patterns Types:

Chain of responsibility : The responsibility of handling the request data is given to any of the members of the “chain”. If the first link of the chain cannot handle the responsibility, it passes the request data to the next level in the chain, i.e. to the next link. (a chain of classes that process request )

Command : The client invokes a particular module using a command. The client passes a request, this request gets propagated as a command. The command request maps to particular modules. According to the command, a module is invoked. (request encapsulated in an object )

Interpreter : It converts the code written in English to a byte code format so as to make possible for all the operating systems to understand it.

Iterator : which allows you to navigate through a collection of data using a common interface without knowing about the underlying implementation.

Mediator : It promotes loose-coupling of classes such that only one class (Mediator) has the knowledge of all the classes, rest of the classes have their responsibilities and they only interact with the Mediator.

Memento : without violating encapsulation, capture and externalize an objects' internal state so that the object can be restored to this state later. (store and restore object's internal state )

Observer : define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

State : allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
(provides a memory for a class’s instance variables.)

Strategy : Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
(group of classes that represent set of possible behaviors )

Template Method : define the skeleton of an algorithm in an operation, deferring some steps to subclasses. provides a method that allows sub-classes to override parts of method without re-writing it. (provides an abstract definition of an algorithm. )

Visitor : Represent an operation to be performed on the elements of an object structure. Visitor to add new function to a set of classes without having to modify them.