Смотритель: hubert
  • ,

task.task26.task2613 Задание 8

CashMachine (8)

Пора привести в порядок наш main, уж очень там всего много, чего не должно быть.

1. Перенеси логику из main в DepositCommand и InfoCommand.

Проверим, что там стало с main? Цикл, в котором спрашиваем операцию у пользователя, а потом вызываем метод у CommandExecutor.

И так до бесконечности… надо бы придумать условие выхода из цикла.

Исправь цикл, чтоб он стал do-while. Условие выхода — операция EXIT.

2. Давай запустим прогу и пополним счет на EUR 100 2 и USD 20 6, и посмотрим на INFO.

Ничего не понятно, т.к. создались 2 манипулятора: первый для EUR, второй для USD.

Давай улучшим логику InfoCommand. Надо вывести баланс по каждому манипулятору.

2.1. В классе CurrencyManipulatorFactory создай статический метод getAllCurrencyManipulators(), который вернет Collection всех манипуляторов.

У тебя все манипуляторы хранятся в карте, не так ли? Если нет, то отрефактори.

2.2. В InfoCommand в цикле выведите [код валюты — общая сумма денег для выбранной валюты].

Запустим прогу и пополним счет на EUR 100 2 и USD 20 6, и посмотрим на INFO.

Все работает правильно?

EUR — 200

USD — 120

Отлично!

3. Запустим прогу и сразу первой операцией попросим INFO. Ничего не вывело? Непорядок.

Добавь в манипулятор метод boolean hasMoney(), который будет показывать, добавлены ли какие-то банкноты или нет.

4. В InfoCommand используй метод п.3. и выведите фразу «No money available.«, если нет денег в банкомате.
  • ,

com.javarush.task.task18.task1813

package com.javarush.task.task18.task1813;

import java.io.*;

/* 
AmigoOutputStream
*/

public class AmigoOutputStream extends FileOutputStream {
    public static String fileName = "D:/tmp/result.txt";
    private FileOutputStream original = null;


    public AmigoOutputStream(FileOutputStream fileOutputStream) throws Exception {
        super(fileOutputStream.getFD());
        this.original = fileOutputStream;
    }

    @Override
    public void write(int b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        original.write(b, off, len);
    }

    @Override
    public void close() throws IOException {
        original.flush();
        original.write("JavaRush © All rights reserved.".getBytes());
        original.close();
    }

    @Override
    public void flush() throws IOException {
        original.flush();
    }

    public static void main(String[] args) throws Exception {
        new AmigoOutputStream(new FileOutputStream(fileName));
    }

}

Вот такое решение получилось. После того как валидатор принял его, решил протестировать.
переписал метод main следующим образом:
AmigoOutputStream amigoOutputStream = new AmigoOutputStream(new FileOutputStream(fileName));
        amigoOutputStream.close();

Открываю выходной файл и вижу там:
JavaRush © All rights reserved.JavaRush © All rights reserved.

Строка записалась два (!) раза. Отладка показала что переопределенный метод close выполняется два раза…

До верного решения додумался сам заменив строку :
super(fileOutputStream.getFD());
на :
super(filename);
но у меня остались вопросы:
Что это за FileDescriptor, который возвращает метод getFD()?
Получается с его помощью нельзя инициализировать FileOutputStream?
И почему при таком вызове конструктора суперкласса метод close выполняется два раза?