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

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

Комментарии (150)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Dmitrii Sulimov16 уровень
2 августа, 16:12
initialize это какое-то зарезервированное имя или его сократить можно до init?
zertalls7 уровень, Москва
2 августа, 17:20
это просто имя метода. можете назвать его как пожелаете. проверьте сами. не сложно же.
Vladyslav Svyripa8 уровень, Львов
3 июля, 14:14
Зачем нужен этот метод initialize? Кто может подробно описать? Или видео/статья?
Viktor Gromov11 уровень
11 июля, 09:54
Для удобства. Смотри, если бы не было этого метода, то тебе бы пришлось каждой переменной выделять отдельную строчку. Рассмотрим пример из недавней задачки.
public class Person {
    String name;
    int age;
    String address;
    char sex;

    public static void main(String[] args) {
        Person person = new Person();
    }
Чтобы инициализировать все эти данные, в методе main, да и в других методах и классах тебе бы пришлось писать следующее:
public static void main(String[] args) {
        Person person = new Person();
        person.name = "name";
        person.age = 25;
        person.address = "address";
        person.sex = 'M';
    }
И так каждый раз, когда ты хочешь создать новый объект! Но программисты по природе ленивые, поэтому пишут всякие свои вот эти методы, чтобы укоротить запись. Поэтому мы можем сделать так:
public static void main(String[] args) {
        Person person = new Person();
        person.initialize("Name", 25, "address", 'M');
    }
    public void initialize(String name, int age, String address, char sex) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.sex = sex;
    }
Если серьезно, то этот метод значительно упрощает жизнь. Да, для одной переменной может и не видно явного профита, но если и их несколько, то метод initialize очень сильно помогает. Попробуйте создать несколько объектов класса с несколькими переменными и вы увидите, что этот метод просто необходим. Это значительно упрощает чтение кода.
Viktor Gromov11 уровень
11 июля, 12:13
Еще, конечно же, этот метод нужен, чтобы все переменные были инициализированы. К примеру, имеем все тот же код. Но в нем, например, не известен адрес. Ну бывает так, человека узнал, а где он живет - нет. Тогда мы создаем код без входного значения address, а в самом методе передаем ему какое-то стандартное значение.
public static void main(String[] args) {
        Person person = new Person();
        person.initialize("Name", 25, "address", 'M');
    }
    public void initialize(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.address = "где-то";
        this.sex = sex;
    }
Таким образом мы не даем нашей переменной остаться без значения. Позже, когда она где-то будет использоваться, это не приведет к ошибкам, которые могли бы у нас возникнуть при отсутствии значения. Возможно, можно было бы давать значения в самом объявлении переменных, т.е. вот тут и вот так
public class Person {
    String name;
    int age;
    String address = "где-то";
    char sex;
...
Но сдается мне, это моветон
Viktor Gromov11 уровень
11 июля, 15:11
Ну initiallize - это отдельный метод, который и вызывать придется отдельно. В текущей лекции вас учат инициализировать переменные через такой метод. Думаю, это сделано для того, чтобы потом была более понятной работа конструктора. О нем уже через лекцию или через пару лекций будут говорить.
Oleg Yev11 уровень, Минск
11 июля, 17:44
Спасибо, понял!
Vladyslav Svyripa8 уровень, Львов
13 июля, 16:57
Спасибо большое!
Den Li7 уровень, Винница
5 августа, 18:06
Почему Вы объяснили лучше проще и доходчивее, чем в статье? :) Спасибо большое! З.Ы.: Администрация - обратите внимание на Виктора - возможно пропадает будущий лектор-практик)
Viktor Gromov11 уровень
6 августа, 19:37
Рад был помочь :) Однако допустил там небольшую ошибку. То, что я посчитал моветоном, на самом деле, используется. Я про задание начальных значений переменных в самом классе при их объявлении. Думаю, когда до final модификатора дойдете, тогда этот способ получит хоть какое-то объяснение. Но сам до сих пор такого не делал. P.s. После каждой лекции по привычке лезу в комментарии, чтобы найти какие-то исправления, дополнительную информацию, а если вижу вопрос, на который сам могу ответить, то стараюсь его не пропускать. И этим движет совсем не альтруизм, а желание самому разобраться в материале более подробно :)
Любовь 16 уровень, Новосибирск
29 июня, 13:22
MyFile file = new MyFile(); file.initialize("c:\data\a.txt"); MyFile file2 = new MyFile(); file2.initialize("a.txt"); Кто-нибудь может объяснить, что здесь происходит? По идее, это должен был бы быть пример создания копии файла, но.....
Любовь 16 уровень, Новосибирск
29 июня, 13:26
В примере ошибка, должно было быть: MyFile file = new MyFile(); file.initialize("c:\data\a.txt"); MyFile file2 = new MyFile(); MyFile file2 = new MyFile(file, "a.txt"); <----- вот здесь
Любовь 16 уровень, Новосибирск
29 июня, 13:40
То есть, в 4ой строке кода --- мы указали путь к файлу "file2", что он лежит в папке файла "file", и имя "file2" в папке "a.txt". Я правильно понимаю?
Wladyslaw20 уровень
6 июня, 08:31
А конструктор описать со всеми необходимыми параметрами чем не вариант?
sergey12 уровень, Львов
13 июня, 05:47
вот мне тоже интересно... Почему нельзя использовать конструктор с параметрами инициализации объекта? зачем нужны такие инициализаторы?
NomakAnton9 уровень, Казань
6 июля, 11:38
Плюсую,тоже не понимаю почему нельзя обойтись конструкторами.Хотя может это они нас так подталкивают к тебе конструкторов?
S22 уровень, Минск
17 июля, 18:26
ЭТО ПОДВОДКА к теме КОНСТРУКТОРОВ!
Александр Иванников6 уровень, Владивосток
16 августа, 03:02
Сдается мне что в какой-нибудь программе надо будет в коде сначала нагенерить 100500 объектов просто с запасом, когда не знаешь сколько их может понадобиться, а затем задействовать их по мере необходимости задавая им значения. А конструктор вызывается только в момент создания объекта, потому в данном сценарии(когда надо задать значения потом) не подходит. Имя же метода initialize может быть любым, но принято использовать именно это для унификации.
Gwinblade30 уровень, Москва
5 июня, 11:19
В 3-ем примере, кажется, ошибка. При вызове метода file2.initialize("a.txt"); забыли написать ещё один параметр.
Dronya_338 уровень, Москва
26 мая, 11:12
А нафига сей метод, если есть конструкторы?
Александр Иванников6 уровень, Владивосток
16 августа, 03:07
Ответ(предположительный) на этот вопрос от меня-же парой строк выше.
Александр9 уровень, Москва
30 апреля, 13:17
не понятно ничего с моментом "создание копии файла рядом с текущим". Для чего? и что нам дает "file.readText();"??? Может кто-нибудь объяснить или дать ссылку на более понятное объяснение? Потому как это лекция от javarush ровным счетом ничего не объясняет
Александр10 уровень, Москва
30 апреля, 22:28
Метод initialize(MyFile file, String name) что делает - берет файл из параметра 1, получает путь к папке, где находится файл из параметра 1 и затем к этому пути добавляет имя файла из параметра 2. По поводу file.readText(); - в методе MyFile не описан метод readText(), но могу предположить, что он должен читать и возвращать текст из файла как строку.
berik5 уровень, Алматы
28 апреля, 10:16
MyFile file = new MyFile(); file.initialize("c:\data\a.txt"); String text = file.readText(); - А что делает этот метод в данном случае? Или его тоже нужно добавить от руки?
Александр10 уровень, Москва
30 апреля, 22:29
По поводу file.readText(); - в методе MyFile не описан метод readText(), но могу предположить, что он должен читать и возвращать текст из файла как строку. Да.
GigaMax12 уровень
23 апреля, 14:22
+ больше ясности)))
vrestles16 уровень, Москва
16 апреля, 12:46
Подскажите, пожалуйста, в чем различие между конструктором и инициализатором?
Valery20 уровень
20 апреля, 13:55
Инициализатор запускается перед конструкторами, а конструкторы перед всем кодом. проще говоря инициализатор для константных значений полей (для того чтобы не были пустые поля, как в конструкторе по умолчания) , а конструктор для назначение новых значений полей.
Valery20 уровень
20 апреля, 13:58
P.S. в данной теме инициализатор - это просто так метод называется, а я описывал настоящий инициализатор, который имеет свой собственный вызов.
Евгений13 уровень
19 мая, 13:30
тот же вопрос родился. Конкретно в этом примере с этой задачей конструктор прекрасно бы справился.