Инициализация объектов, метод 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("a.txt");

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

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

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

Комментарии (119)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
vrestles8 уровень, Москва
вторник, 12:46
Подскажите, пожалуйста, в чем различие между конструктором и инициализатором?
Wl.6 уровень
2 апреля, 20:25
Получается, создав один какой-то класс и пару переменных, нужно тут же ввести для них все эти методы - инициализация, сеттеры, гетеры? Или что то одно? Как правильно то?
Sergey7 уровень
17 марта, 06:58
+ 1 шаг к цели "Стать Java-программистом"
Rina14 уровень
8 марта, 19:28
initialize и метод setName выглядят совершенно одинаково. В чем разница между ними?
Sergey7 уровень
17 марта, 06:50
setName - устанавливает значение поля name, устанавливать можно сколько угодно раз в коде. initialize - устанавливает первоначальное значение (инициализирует) поля name и, можно сказать, что переводит объект в валидное состояние, т.е. в состояние, при котором объект в дальнейшем можно использовать.
Александра8 уровень, Москва
4 марта, 10:23
Вообще перестаю что-либо понимать...((
Valeriy10 уровень
27 февраля, 02:29
Очень сильное ощущение, что для понимания синтаксиса данная лекция лишняя, она только запутывает. Т.к. в предыдущих лекциях (не помню точно в какой) была ссылка на конструкторы. А теперь вместо обычных конструкторов заставляют делать не пойми что.
Sergey Rudeshko6 уровень, Москва
20 февраля, 13:47
есть мнение, что про initialize JavaRush просто забивает нам голову, т.к этот метод используют люди кто не понимает ООП.
Hexronimo17 уровень
18 февраля, 12:16
Кто подумал про конструктор - , да, он через две лекции.
Denis7 уровень
17 февраля, 13:55
В чем принципиальное отличие этого метода от конструктора?
katfald18 уровень, Киев
14 февраля, 14:33
В чм отличие инициализатора от конструктора? В каких случаях они используются?