public class AmigoOutputStream extends FileOutputStream {
public static String fileName = "C:/tmp/result.txt";
private FileOutputStream stream;
AmigoOutputStream(FileOutputStream stream) throws FileNotFoundException {
super(stream.toString());
this.stream=stream;
}
public static void main(String[] args) throws FileNotFoundException {
new AmigoOutputStream(new FileOutputStream(fileName));
}
Что-то я не понимаю,мы создаем объект "обертку" для FileOutputStream,при этом передавая в него уже открытый поток,а потом на следующей строчке(конструктора AmigoOutputStream) вызываем конструктор super(),который открывает 2-ой поток FileOutputStream.Получается у нас будет 2 потока FileOutputStream на один и тот же файл?И куда этот 2 поток сохраняется??Кирилл
19 уровень
2 Потока
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #2322530
5 декабря 2020, 13:35решение
не совсем корректно это. потому что метод toString не переопределен.
И куда этот 2 поток сохраняется??
никуда)
если у родителя есть конструктор с аргументами, тогда ты обязан его переопределить, и в нём первой же строкой надо вызвать конструктор родителя. для этого и нужна эта строка.
+2
Кирилл
5 декабря 2020, 15:29
А общая мысль про два потока верна?Например,если бы я вызывал super(fileName).
Было бы два открытых потока, и до тех пор,пока сборщик мусора не уничтожил, 2 поток (тот который нельзя достичь),он был бы открыт.
0
hidden #2322530
5 декабря 2020, 15:35
в этой задаче да. но не стоит здесь искать сакральный смысл, эта задача всего лишь для того, чтобы познакомить с паттерном "декоратор"
0
Кирилл
5 декабря 2020, 20:23
да я вообще думал что декоратор реализуется через композицию и интерфейсы,спасибо за ответ,просто напрягло,что создается 2-ой по сути неиспользуемый и занимающий память поток. :(
0
hidden #2322530
5 декабря 2020, 20:45полезный
ну JVM довольно неплохо управляется с памятью, поэтому думаю не стоит об этом думать в таких задачах)
декоратор не может быть через композицию, потому декоратор - обёртка, ты оборачиваешь уже существующий класс, который и без твоей обёртки прекрасно живёт. да и почему только интерфейсы. класс обёртка или будет наследовать класс, который он оборачивает) или реализует интерфейс, но аргументом всё равно принимает некий класс. тут дело уже за архитектурой.
так что максимум агрегация)
как машина и двигатель, ты можешь вытащить двигатель, и поставить в другую машину, или даже просто использовать сам по себе.
композиция, это когда жёсткая связь. как человек и лёгкие. нельзя их разделить, нельзя использовать лёгкие отдельно от человека.
отличные примеры декораторов, это:
BufferedReader обёртка для FileReader
BufferedWrite обёртка для FileWriter
+2
Кирилл
6 декабря 2020, 11:33
Да точно,уже подзабылись такие понятия,спасибо за развернутый ответ
0