JavaRush /Курсы /Java Syntax /Инициализация объектов, метод Initialize

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

Java Syntax
5 уровень , 6 лекция
Открыта

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

— Рассмотрим для примера объект типа 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();

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

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

Комментарии (418)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим Уровень 22 Expert
17 августа 2023
Не понимаю в чём его смысл если есть конструктор,тем более когда созданы инициализаторы и в них есть параметры обьект всё равно можно создать без инициализации
bakvit Уровень 13
14 июля 2023
про создание временных копий ничего не понятно, но очень интересно )
Mudril Уровень 28
18 декабря 2022
Похоже раньше эта лекция раньше шла до конструкторов, в которых можно реализовать точно такой же функционал, но в лучше - без дополнительного вызова initialize. Из примера выше это было бы не

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

MyFile file = new MyFile("c:\data\a.txt");
Что выглядит понятнее для тех же разработчиков, по аналогии 3 строк для while против 1 строки для цикла for.
Timur Khasmamedov Уровень 14 Expert
27 января 2023
Ну, видимо это еще 1 взгляд на то, как можно создать экземпляр (и наполнить): - можно создать (с пустым дефолтным конструктором) и позже инициализировать поля с помощью методов - а можно сразу создать с необходимыми полями, используя нужный конструктор. но опять же не очень понятно почему не привести примеры с 1 и со 2, это намного нагляднее, чем давать материал по частям, имхо. очень напоминает объявление переменной и потом ее создание с присвоением экземпляра ссылки и "3 в 1" сразу.
Sammi Уровень 18
2 апреля 2023
level05.lecture06 из URI
Дмитрий Уровень 11 Expert
31 октября 2022
У меня у одного на протяжении всего обучения такое состояние, будто я что-то упустил? И с каждым уровнем, увы, оно не убавляется, а скорее - наоборот ;(
Artur Kupchenko Уровень 28
8 ноября 2022
То же самое чувство.
AMIGO_2022_11_09 Уровень 17
14 ноября 2022
Главное не бросайте, понимание придёт
Sammi Уровень 18
2 апреля 2023
едем тихо, не паримся) спать расстроенными не ложимся :-D глаза боятся- руки делают 💪 Ты не один)
ivankoffpavel Уровень 19
26 апреля 2023
Дмитрий Вы не один, но думаю цель - повторение. И я считаю это хорошо.
Nicola Уровень 26
29 августа 2022
String text = file.readText(); // не пониманю что делает и откуда этот метод в классе .readText(); что он озанчате в примере.....хмм
Benjam1nBTN Уровень 24
3 августа 2022
Метод initialize чем отличается от просто сеттера?
Владимир Уровень 39
19 августа 2022
Наверное, у такого метода подразумевается комплексный и неочевидный функционал, в отличие от сеттера
ivankoffpavel Уровень 19
26 апреля 2023
Сеттер используем для приватных полей для валидации значения поля-переменной.
Евгений N Уровень 23
29 марта 2022
кража черной материи продолжается! 😄😄😄
Евгений N Уровень 23
29 марта 2022
чую на следующей странице будет "но лучше вместо initialize использовать конструктор"
Никита Уровень 25
1 марта 2022
Непонятно, зачем изобретать велосипед? Когда можно использовать старый добрый конструктор класса, в котором можно проинициализировать всё необходимое...
Anonymous #3025762 Уровень 28
9 марта 2022
Это лекция раньше шла перед конструктором класса,чтобы показать, что метод initialize() не решение проблемы(можно забыть вызывать и т.д)
DimanchikS Уровень 22
12 января 2022
Пример крайне контринтуитивный. Тут это выглядит как бестолковая замена конструктору. Если хочется не допустить создания файла с пустым именем, то либо зашиваем дефолтное значение прямо в объявление переменной, либо в инициализирующий блок (который вызывается перед телом любого конструктора), либо требуем указания имени и пути в конструкторе (ну или задаём дефолтное там же). Конструкторов можно налепить сколько захочется и вызывать одни из других. Если возникает ситуация, когда нужно сначала проинициализировать объект обязательно какими-то дефолтными значениями, а потом уже половину из них вдруг поменять разом и не через сеттеры, то стоит задуматься, а мы точно создаём то что надо, когда и где надо и с теми параметрами, какими надо? P.S. И совершенно непонятно, почему это идёт рассказом о конструкторах. Вредный велосипед.