Инициализация объектов, метод 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 лекция
Недоступна
Набираем код
Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

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

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

Комментарии (192)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Юрий5 уровень
3 ноября, 20:11
А в чем разница между такой явной инициализации объекта и использованием конструктора?
Alexander Podlesny8 уровень, Москва
позавчера, 17:40
в том, что явную можно забыть и не вызвать, поэтому, скорее всего, дальше нам скажут, что вообще так делать не надо - лучше использовать конструкторы.
51_Drummer7 уровень, Минск
21 октября, 19:12
оу переменная fileName, или пошли исключения в написании имён переменных?
Justinian41 уровень, Киев
22 октября, 14:08
очепятка
Rakhmetov Yedil9 уровень
19 октября, 15:54
Всё это время мы решали задачи используя конструктор, но до сих пор не знаю что это)
Евгений Белый7 уровень, Киев
5 октября, 14:24
Это типо мы создали объект , которому не дописали(случайно,умышленно) параметры,и этот метод позволяет их ему добавлять?
Евгений Белый7 уровень, Киев
5 октября, 08:53
Кто адекватно подитожит,зачем мне это и что это?
Vladyslav25 уровень
11 октября, 23:11
При создании объекта иногда удобно сразу присваивать значения переменным его класса(чтобы потом не вызывать сэттэры)- для этого используются конструкторы
Sergey Zotov5 уровень, Челябинск
15 октября, 16:50
Иногда чтобы объект был валиден нужно сразу задать ему некоторые параметры (в данном случае имя файла например). Если мы их не задали и попытались прочитать текст из файла, то непонятно будет откуда читать этот текст, потому что мы не знаем где находится этот файл и какое у него имя:
MyFile file = new MyFile();
file.readText();
Поэтому вызывается метод initialize(String fileName); А так да, для этого лучше использовать конструкторы)
3 октября, 13:26
Почему переменные в теле класса не объявлены? В первых примерах. Или я чего-то не понимаю :)
Камила Кафетулина10 уровень, Москва
30 сентября, 17:20
мда, видимо, традиционно понимание придет через лекции 2-3))
Игорь Сенников20 уровень, Новороссийск
23 сентября, 14:22
Очень бесит тот момент что написан не весь код. И по этой причине много лекций с первого раз сложно понять. Что значит для фока написали getFolder(). Напишите целиком что бы с самого начала пытались понять что от куда растет и где какие связи между всем этим кодом. А то так получается какой то рудимент который новичок не сможет понять и только сильнее запутает.
AliceecilA8 уровень, Санкт-Петербург
19 сентября, 18:28
я ничего не поняла
Алексей15 уровень, Полысаево
25 сентября, 01:35
Еще не привыкли, что тут сперва бьют по голове, а потом рассказывают как надо было уклониться? Объяснят чуть дальше, пока у вас есть над чем подумать. Скажем, но мы ведь уже писали конструкторы, которые заполняют переменные, зачем нам нужен какой-то еще метод initialize? ответ: а нужен для заполнения значений по умолчанию, в любом месте программы, без повторного вызова конструктора.
Денис14 уровень, Москва
27 сентября, 13:52
Спасибо тебе, добрый человек.
Юрий5 уровень
3 ноября, 20:13
Дошло! Черт, ненавидел до этого ООП, хотя и программил немного на питоне. И сейчас ненавижу - придет джава и сожрет всю память :)
Artem Boyarshinov27 уровень, Москва
18 сентября, 12:42
Сначала объяснили, что для изменения полей класса нужно использовать методы сеттеры, которые именуются по принципу setPoleName, а потом для этих же целей используют метод с названием initialize. Непорядок! Или это стандартное название для метода, который устанавливает все поля класса? Но разве не конструкторы предназначены для этого?
Artem Boyarshinov27 уровень, Москва
18 сентября, 13:17
Прошел дальше - понял, что это была подводка к конструкторам.