Problem Statement:
Design a BALANCE class with account number, balance and date of last updation. Consider a TRANSACTION class with account number, date of transaction, amount and transaction type. Check whether the amount is available or not in case of a withdrawal. Transaction object will make necessary updation in the BALANCE class.
Balance
Class
package balance;
import java.util.Date;
import java.util.Scanner;
public class Balance {
private double balance;
private Date date;
private long accountNum;
Scanner sc = new Scanner(System.in);
public Balance(long aNo, double money, Date aDate) {
accountNum = aNo;
balance = money;
date = (Date) aDate.clone();
System.out.println("New account created with account no :" + accountNum);
System.out.println("Opening balance rs. " + balance);
System.out.println("Account created on " + date.toString());
}
public Balance(Balance b) {
balance = b.balance;
date = b.date;
accountNum = b.accountNum;
}
public Balance() {
}
public long getAccountNum() {
return accountNum;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String toString() {
return "A/C no.: " + accountNum + "\nCurrent balance: " + balance
+ "\nLast date of update: " + date;
}
}
Bank
class to operate on Balance
class, contains an ArrayList
of Balance
objects:
package balance;
import java.util.ArrayList;
import java.util.Iterator;
public class Bank {
private ArrayList<Balance> balanceList;
Iterator<Balance> itr;
public Bank() {
balanceList = new ArrayList<Balance>();
}
public void newAccount(Balance e) {
balanceList.add(e);
}
public Balance searchAccount(long accountNum) {
itr = balanceList.iterator();
while (itr.hasNext()) {
Balance b = new Balance(itr.next());
if (b.getAccountNum() == accountNum)
return b;
}
return null;
}
public long getBalanceListSize() {
return balanceList.size();
}
}
Transaction
class to operate on a Bank
:
package balance;
import java.util.Date;
import java.util.Scanner;
public class Transaction {
private String transactionType;
private double amount;
private long accountNum;
private Date date;
private Bank b;
private Balance balance = new Balance();
Scanner sc = new Scanner(System.in);
public Transaction() {
b = new Bank();
}
public void transaction(long accountNum, String transactionType,
double amount) {
this.accountNum= accountNum;
this.transactionType = transactionType;
this.amount = amount;
date = new Date();
operation();
}
private void operation() {
if (transactionType.equalsIgnoreCase("Opening")) {
if (amount < 0) {
System.out.println("Opening balance cannot be less than zero.");
return;
}
balance = new Balance(b.getBalanceListSize() + 1, amount, date);
b.newAccount(balance);
}
else if (transactionType.equalsIgnoreCase("withdraw")) {
balance = b.searchAccount(accountNum);
if (balance == null) {
System.out.println("Account not found");
return;
}
if (balance.getBalance() < amount) {
System.out.println("Insufficient Balance.");
return;
}
System.out.println("Balance before transaction:");
System.out.println(balance.toString());
balance.setBalance(balance.getBalance() - amount);
System.out.println("Balance after transaction:\n"
+ balance.toString());
}
else if (transactionType.equalsIgnoreCase("deposit")) {
balance = b.searchAccount(accountNum);
if (balance == null) {
System.out.println("Account not found");
return;
}
System.out.println("Balance before transaction:");
System.out.println(balance.toString());
balance.setBalance(balance.getBalance() + amount);
System.out.println("Balance after transaction:\n"
+ balance.toString());
}
else if (transactionType.equalsIgnoreCase("showInfo")) {
balance = b.searchAccount(accountNum);
if (balance == null) {
System.out.println("Account not found");
return;
}
System.out.println(balance.toString());
}
else {
System.out.println("Invalid option");
return;
}
}
}
BankDemo
Class containing main()
:
package balance;
import java.util.*;
public class BankDemo {
public static void main(String args[]) {
String choice, ch, operation;
Transaction transac = new Transaction();
Scanner sc = new Scanner(System.in);
double amount;
long accountNo;
do {
System.out.println("1. New account");
System.out.println("2. Transaction");
System.out.println("3. View Account Information");
System.out.println("q. Exit");
System.out.println("choice:");
choice = sc.next();
switch (choice) {
case "1":
double openingBalance;
System.out.println("Enter the opening balance :");
openingBalance = sc.nextDouble();
transac.transaction(0, "Opening", openingBalance);
break;
case "2":
System.out.println("a. Deposit");
System.out.println("b. Withdraw");
ch = sc.next();
if (ch.equalsIgnoreCase("a"))
operation = "Deposit";
else if (ch.equalsIgnoreCase("b"))
operation = "Withdraw";
else {
operation = "Invalid option";
}
System.out.println("Account Number:");
accountNo = sc.nextLong();
System.out.println("Amount:");
amount = sc.nextDouble();
transac.transaction(accountNo, operation, amount);
break;
case "3":
System.out.println("Account Number:");
accountNo = sc.nextLong();
operation = "showInfo";
transac.transaction(accountNo, operation, 0);
break;
case "q":
System.out.println("Thank you!");
break;
default:
System.out.println("Wrong choice!!");
}
} while (choice != "q");
sc.close();
}
}
I'm looking for suggestions, improvements on readability, OOP approach, and design.