java наследование
Создайте класс, который будет представлять собой расчётный счёт в банке. На этот расчётный счёт деньги можно положить, с него их можно снять, и ещё можно посмотреть, сколько денег на счёте. Создайте два класса-наследника - депозитарный расчётный счёт, с которого нельзя снимать деньги в течение месяц
пожалуйста обьясните как сделать так чтоб при использовании метода add запускался отсчет времени и при методе withdraw отсчет времени заканчивался, чтоб подсчитать разницу и понять прошел ли месяц или нет.
public class Main {
public static void main(String[] args) {
Bank bank = new Bank(0);
for (; ; ) {
System.out.println("\nВведите операцию, которую хотите совершить: \n\nadd - внести деньги на счет \ncheck - проверить остаток на счету \nwithdraw - снять деньги со счета \nexit - выйти");
Scanner scanner = new Scanner(System.in);
String opName = scanner.nextLine();
if (opName.equals("add")) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.YYYY");
System.out.println("Введите сумму");
int i = scanner.nextInt();
bank.add(i);
System.out.println("Внесенны деньги на сумму " + i);
} else if (opName.equals("check")) {
int moneyNow = bank.check();
System.out.println("Остаток на счету: " + moneyNow );
} else if (opName.equals("withdraw")) {
System.out.println("Введите сумму");
int i = scanner.nextInt();
bank.withdraw(i);
System.out.println("Было списано со счета: " + i);
} else if (opName.equals("exit")) {
break;
} else System.out.println("Неправильно введены данные");
}
}
package operations;
public class Bank {
public int money = 0;
public Bank (int money) {
this.money = money;
}
public void add (int amount) {
money += amount;
System.out.println("Остаток на счету " + money);
}
public void withdraw (int amount) {
money -= amount;
System.out.println("Остаток на счету " + money);
}
public int check() {
System.out.println(money);
return money;
}
}
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
public class Deposit extends Bank {
public Deposit(int money) {
super(money);
}
public void add (int amount) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.YYYY");
LocalDate startDate = LocalDate.now();
}
public void withdraw (int amount) {
LocalDate finishDate = LocalDate.now();
}
}
Ответы (1 шт):
Вам не нужно запускать отсчета времени. Представьте, что у вас не один счет, а сотни тысяч. Запустите 100000 потоков для того, чтобы понять, когда истекает депозит? Все на много проще. Нужно хранить дату открытия депозита и в момент,когда деньги пытаются снять, сравнивать ее с текущей датой, определяя прошел срок депозита или нет. Кроме того, помните про принцип единой ответственности. Ваши методы класса Bank не только добавляют и снимают деньги, а еще и выполняют вывод в консоль. Вместе с тем, данные методы не выполняют своих функций должным образом. Например, в вашей реализации со счета можно снять больше денег, чем на нем лежит. Это будет препятствовать переиспользованию этих методов в дальнейшем. Попробуйте сделать так:
public class Bank {
private long money;
public Bank(long money) {
this.money = money;
}
public boolean add(long amount) {
if (amount<=0) return false;
money += amount;
return true;
}
public boolean withdraw(long amount) {
if (amount>money || amount<=0) return false;
money -= amount;
return true;
}
public long check() {
return money;
}
@Override
public String toString() {
return "Остаток на счету " + money;
}
}
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class DepositBank extends Bank{
private LocalDateTime dateTime;
private final int depositPeroidInMonth;
public DepositBank(long money, int depositPeroidInMonth) {
super(money);
this.dateTime = LocalDateTime.now();
this.depositPeroidInMonth = depositPeroidInMonth;
}
public DepositBank(long money) {
super(money);
this.dateTime = LocalDateTime.now();
this.depositPeroidInMonth = 1;
}
@Override
public boolean withdraw(long amount) {
return ChronoUnit.MONTHS.between(dateTime, LocalDateTime.now()) >= depositPeroidInMonth ?
super.withdraw(amount) : false;
}
}
Рефакторинг класс Main на вашей совести.