Tuesday, January 25, 2011

Advance Object Oriented Programming.

In this example we will see Advance Object Oriented Programming.

We will use a simple banking example for this.

Steps:

  1. Create folder “src”. This will contain all java files.
  2. Then create AdvOOPTest1 to test the application.

The structure will be as follow

  • src/InsufficientFundsException.java
  • src/IllegalTransferException.java
  • src/Account.java
  • src/CustomerAccount.java
  • src/CurrentAccount.java
  • src/SavingsAccount.java
  • src/Banker.java
  • AdvOOPTest1.java

IllegalTransferException.java

package com.pravin.banking;

public class IllegalTransferException extends RuntimeException{}

Account.java

package com.pravin.banking;

/**
An abstract super-class for all account types in the bank.
@author Pravin
@see SavingsAccount
@see CurrentAccount
*/
public abstract class Account{
long id;

/**
Returns ID of this account.
*/
public long getId(){
return id;
}

/**
Returns the current-balance in this account.
*/
public abstract double getBalance();

/**
Credits the specified amount in this account.
*/
public abstract void deposit(double amount);

/**
Debits the specified amount from this account.
@throws InsufficientFundsException Specified amount cannot be withdrawn
*/
public abstract void withdraw(double amount) throws InsufficientFundsException;

/**
Transfer specified amount to another account.
@param amount Funds to transfer
@param other The target account
@throws InsufficientFundsException This account does not hold specified
amount
@throws IllegalTransferException Target account is identical to this
account
*/
public final void transfer(double amount, Account other)
throws InsufficientFundsException{
if(other == this)
throw new IllegalTransferException();
this.withdraw(amount);
other.deposit(amount);
}
}


CustomerAccount.java

package com.pravin.banking;

public abstract class CustomerAccount extends Account{
protected double balance;

public double getBalance(){
return balance;
}

public void deposit(double amount){
balance += amount;
}
}


CurrentAccount.java

package com.pravin.banking;

public final class CurrentAccount extends CustomerAccount{
public void withdraw(double amount){
balance -= amount;
}
}


SavingsAccount.java

package com.pravin.banking;

public final class SavingsAccount extends CustomerAccount
implements Profitable{
public static final double MIN_BALANCE = 500.0;

public SavingsAccount(){
balance = MIN_BALANCE;
}

public void withdraw(double amount) throws InsufficientFundsException{
if(balance - amount <>
throw new InsufficientFundsException();
balance -= amount;
}

public double addInterest(int period){
float rate = (balance <>
double interest = balance * rate * period / 100;
balance += interest;
return interest;
}
}


Banker.java

package com.pravin.banking;

public class Banker{
private static Banker singleton;

private long nextId;

private Banker(){
nextId = System.currentTimeMillis() % 1000000;
}

public static Banker getBanker(){
if(singleton == null)
singleton = new Banker();
return singleton;
}

public Account openAccount(double amount, boolean savings){
Account acc;
if(savings)
acc = new SavingsAccount();
else
acc = new CurrentAccount();
acc.id = nextId++;
acc.deposit(amount);
return acc;
}

public final Account openAccount(double amount){
return openAccount(amount, false);
}
}


AdvOOPTest1.java

import com.pravin.banking.*;

class AdvOOPTest1{
public static void main(String[] args){
Banker b = Banker.getBanker();
Account cust = b.openAccount(4500, true);
Account vend = b.openAccount(0);
try{
double amt = Double.parseDouble(args[0]);
cust.transfer(amt, vend);
}catch(InsufficientFundsException e){
System.out.println("ERROR: Transfer aborted due to lack of funds!");
}catch(Exception e){
System.out.printf("ERROR: %s%n", e);
}
System.out.printf("Customer Account ID is %d and Balance is %.2f%n", cust.getId(), cust.getBalance());
System.out.printf("Vendor Account ID is %d and Balance is %.2f%n", vend.getId(), vend.getBalance());
}
}

To compile:

javac -d . src/*.java

javac AdvOOPTest1.java

To run:

java AdvOOPTest1 2000

No comments: