Problem Statement:
Design a
BALANCE
class with account number, balance and date of last updation. Consider aTRANSACTION
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 updates in theBALANCE
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, containing 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 with 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.