Инициализация объектов, метод Initialize

Открыта

— Хочу рассказать тебе об инициализации объектов. Когда объект создаётся – его переменным нужно присвоить стартовые данные. Чтобы не было ситуаций, когда ты обращаешься к объекту, а внутри у него нет нужной ему информации для правильной работы.

— Рассмотрим для примера объект типа File (файл). Минимальной необходимой информацией для файла является его имя. Создать файл без имени – это бессмыслица.

— Допустим, мы пишем свой класс для работы с файлами — MyFile, какая информация нужна каждому объекту этого класса?

— Имя файла, с которым этот объект будет работать?

— Правильно. Для этого добавим в наш класс метод initialize(). Это будет выглядеть примерно так:

Пример:
class MyFile
{
    private String filename = null;

    public void initialize(String name)
    {
        this.filename = name;
    }}

— Мы добавили метод initialize, чтобы с объектом можно было работать – вызывать его методы. Это можно делать сразу после вызова метода initialize. Если с объектом работать нельзя, его называют невалидным (invalid), если можно – валидным (valid). Основная задача метода initialize – передать в объект все необходимые данные, чтобы сделать его валидным.

— Ясно.

— Теперь усложним задачу. Вернее упростим. Как посмотреть. Представим, что другому программисту, который будет использовать наш класс, удобнее передавать в него не полное имя файла, а директорию и короткое имя файла. Мы бы смогли реализовать эту функциональность с помощью ещё одного метода initialize (Java позволяет создавать несколько методов с одинаковыми именами). Тогда наш класс стал бы выглядеть так:

Пример с двумя методами initialize
class MyFile
{
    private String filename = null;
    public void initialize(String name)
    {
        this.filename = name;
    }

    public void initialize(String folder, String name)
    {
        this.filename = folder + name;
    }}

— А ещё, часто нужно создать временную копию файла рядом с текущим.

— Мы можем сделать метод для этого случая?

— Конечно, вот смотри:

Создание файла рядом с текущим файлом:
class MyFile
{
    private String filename = null;
    public void initialize(String name)
    {
        this.filename = name;
    }

    public void initialize(String folder, String name)
    {
        this.filename = folder + name;
    }

    // Файл filename будет находиться в той же директории, что и file.
    public void initialize(MyFile file, String name)
    {
        this.filename = file.getFolder() + name;
    }}

— И что, я могу сделать таких методов сколько угодно?

— Разумные пределы, конечно, есть. Но, в принципе, да, сколько угодно.

— А когда надо вызывать метод initialize?

Сразу после создания объекта, чтобы перевести его в валидное состояние:

Примеры
MyFile file = new MyFile();
file.initialize("c:\data\a.txt");

String text = file.readText();
MyFile file = new MyFile();
file.initialize("c:\data∖", "a.txt");

String text = file.readText();
MyFile file = new MyFile();
file.initialize("c:\data\a.txt");

MyFile file2 = new MyFile();
file2.initialize(file, "a.txt");

String text = file2.readText();
2
Задача
Java Syntax,  5 уровень,  6 лекция
Недоступна
Набираем код Ӏ Java Syntax: 5 уровень, 6 лекция
Java Syntax: 5 уровень, 6 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

— А что ещё за метод getFolder()?

— По логике этот метод должен возвращать строку с именем папки, в которой находится наш файл. Но мы его тут не писали, он чисто для фона.

Комментарии (293)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Oleg Chilikin5 уровень, Москва
понедельник, 20:14
Данная лекция только путает. Сначала я уперся в тему сэттеров и гэттеров, не мог осознать их назначение, дошел до этой лекции и глаза сложились в кучу, что?...зачем метод инициализации...какие файлы, какие пути к файлам? не рановато ли еще с файлами работать и т. д. взял тайм аут, почитал книжки, сторонние порталы по Java, на youtube пару ребят послушал, которые наглядно в идее показывают как это работает. В итоге сам, для тренировки написал отдельный класс с кучей разнотипных объектных методов, и статичный метод инициализации, где на вход приходит объект класса, и с клавиатуры вводятся все его поля. Разобрался, осознал, вернулся к этой статье, и понял, что здесь не хватает объяснения для чего нужен этот метод, можно же сделать перегрузку конструктора. Да, еще очень сильно смущает заполнение полей названием файла, строкой пути, к этому файлу... мы же пока эту тему не трогали, по этому нет наглядности для понимания темы создания метода инициализация.
Oleg Chilikin5 уровень, Москва
позавчера, 22:10
Я уже привык через generate... создавать, он ругается, говорит конструктор уже создан, спасибо, исправлю, тогда тем более, не понимаю зачем нужен метод initialize()...?
Алексей6 уровень, Санкт-Петербург
20 мая, 14:38
хм, после одного из заданий на следующей лекции у меня сложилось впечатление, что метод initialize это метод setName. И получается и тот и другой устанавливает значения переменных. И тот и другой имеют наименование которое скажем так являет общепринятым в обществе программистов. Но гипотетически я мог бы их назвать initialize = utka setName = gusName и по сути ничего не поменялась, только меня бы не поняли. Разница между ними только в том, что initialize запускается как бы первым методом данного класса. А setName запускается по ходу работы (класса/объекта) когда нужно поменять переменную. Все об этом знают, это обще принято поэтому такие названия. У меня правильное понимание или я в чем-то ошибаюсь?
Игорь Кучер34 уровень, Киев
21 мая, 16:54
При создании экземпляра класса (объекта) зачастую его полям нужно присвоить значения. Это делается в конструкторе. Если при работе программы нам нужно изменить какие-либо значения, правильно это делать через сеттеры - методы, названия которых состоят из set + name переменной. Преимущество такого подхода в том, что в методе мы можем организовать проверку входящего значения, либо вызвать другие методы. Вариантов много
Алексей6 уровень, Санкт-Петербург
пятница, 10:04
Это понятно, но получается гипотетически, если бы мы захотели мы бы "set", могли бы заменить на "qwe" сохранить внутренний синтаксис и он работал также. А set это получается общепринятый поход к обозначению, а не строго правило языка программирование.
Игорь Кучер34 уровень, Киев
пятница, 11:30
Что общепринято, то обязательно
Алексей6 уровень, Санкт-Петербург
суббота, 04:39
Понял) спасибо
Иван8 уровень, Москва
16 мая, 14:23
Ребят, пытаюсь уложить всё логически в голове, поправьте меня если не так: 1. Цель - мы хотим создать новый объект. 2. Для этого мы создаем новый класс, где прописываем параметры объекта, которого хотим создать(переменные и методы). 3. Этот новый объект мы можем создать в любом другом классе, указав его класс (параметры с которыми мы хотим чтобы у него были). 4. Видимо есть варианты, когда мы не хотим сразу задавать значения переменных у объекта (сразу прописывать их в классе). 5. В этом случае в классе, где мы прописываем ему параметры, мы пишем методы "public void initialize", для того, чтобы в тот момент, когда мы будем создавать объекты данного класса, мы вызывали эти методы, прописывая в них значения переменных. 6. По логике это сделано для того, чтобы не отыскивать класс, в котором заданы параметры объекта, чтобы задать их в нем, а сразу задать их при создании в любом классе. Если всё так, то вопросы: 1. Когда прописываешь метод "initialize" он не выскакивает в подсказках идеи. То есть правильно ли я понимаю, что я могу задать ему любое другое имя? 2. Не понимаю как вызывать метод синтаксически при создании нового объекта. (видимо дальше будет рассказано)
Nikolay11 уровень, Воронеж
19 мая, 10:39
Возможно, ты уже разобрался конечно, но все равно напишу: 1. initialize это название метода, его ты задаешь сам - также как ты можешь дать любое имя переменной. 2. вызывать метод нужно после создания нового объекта:
Cat cat = new Cat;
cat.initialize(name, age)
Ну и в скобочках через запятую пишешь те параметры которые передаешь каким-либо переменным, только обязательно в том порядке в каком они стоят в методе! Вроде как-то так)))
Nikolay11 уровень, Воронеж
19 мая, 10:44
Надеюсь что сам правильно понял))
kupaka9 уровень, Москва
15 мая, 04:36
Блииииин, только только начинает все вставать на свои места и приходит понимание Java. Бабах, новая лекция - ииииии реальность уплывает от меня , и по монитору рассыпается куча буковок и циферок ....... 🤪🤪🤪
Илья7 уровень, Одинцово
12 мая, 17:08
大广益会玉篇 汉语大字典 汉语大字典 中文大字典 вы тоже видите это в лекции? 说文解字 日本今昔文字鏡
Диана Попеску6 уровень, Днепр
10 мая, 18:47
Никак не могу понять тему , третий раз перечитываю и всё равно не понятно((
Алексей Бугаев10 уровень, Ставрополь
4 мая, 10:45
На мой взгляд, метод initialize - это тот же конструктор класса, только его нужно вызвать самому после создания объекта класса. Но, видимо, суть в том, что в конструктор нельзя передать параметры, отличные от объявленных ранее в классе.
Lev Afanasov9 уровень, Новосибирск
3 мая, 04:55
Мне кажется, или initialize это тот же самый setName ? если нет то в чем разница?
Андрей7 уровень, Новосибирск
18 мая, 16:18
Я как понимаю, метод setName обычно используют для присваивания значения конкретной переменной, а с помощью initialize обычно присваиваются значения сразу группе данных.
Anna Snopova7 уровень, Москва
2 мая, 12:32
Вот тут можно почитать подробнее: https://vertex-academy.com/tutorials/ru/bloki-inicializacii-v-java-chast-1/
Иван Серов7 уровень, Ростов на Дону
30 апреля, 12:47
Вопрос знатокам , ну и ли тем кто въехал в тему)) метод initialize() - входит в какойто пакет или мы его сами только что изобрели?
Alexey7 уровень, Новосибирск
1 мая, 10:43
сами