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

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

Комментарии (133)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Wladyslaw8 уровень
6 июня, 08:31
А конструктор описать со всеми необходимыми параметрами чем не вариант?
sergey6 уровень, Львов
четверг, 05:47
вот мне тоже интересно... Почему нельзя использовать конструктор с параметрами инициализации объекта? зачем нужны такие инициализаторы?
Gwinblade15 уровень, Москва
5 июня, 11:19
В 3-ем примере, кажется, ошибка. При вызове метода file2.initialize("a.txt"); забыли написать ещё один параметр.
Dronya_338 уровень, Москва
26 мая, 11:12
А нафига сей метод, если есть конструкторы?
Александр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
Подскажите, пожалуйста, в чем различие между конструктором и инициализатором?
Valery Toropov20 уровень
20 апреля, 13:55
Инициализатор запускается перед конструкторами, а конструкторы перед всем кодом. проще говоря инициализатор для константных значений полей (для того чтобы не были пустые поля, как в конструкторе по умолчания) , а конструктор для назначение новых значений полей.
Valery Toropov20 уровень
20 апреля, 13:58
P.S. в данной теме инициализатор - это просто так метод называется, а я описывал настоящий инициализатор, который имеет свой собственный вызов.
Евгений8 уровень
19 мая, 13:30
тот же вопрос родился. Конкретно в этом примере с этой задачей конструктор прекрасно бы справился.
Wl.7 уровень
2 апреля, 20:25
Получается, создав один какой-то класс и пару переменных, нужно тут же ввести для них все эти методы - инициализация, сеттеры, гетеры? Или что то одно? Как правильно то?
Valery Toropov20 уровень
20 апреля, 13:55
Если они тебе нужны - то да, если нет - то зачем?
Bce_OK7 уровень, Москва
22 апреля, 12:10
Это нужно, чаще всего, для того, чтобы закрыть(читай "защитить") реализацию твоего класса от пользователя твоих классов. Т.е. чтобы можно было создать кота, инициализировать все его значения по умолчанию, и присвоить значения только нужным параметрам. При этом у тебя эти значения могут проверяться(например, что возраст положительный), параллельно вычисляться(например возраст, по дате рождения или наоборот), и ещё, например чтобы велись логи всего что меняется. И чтобы невозможно было бы напрямую влиять на эти параметры(параметры делать private). Тогда есть смысл делать и геттеры и сеттеры и инициаллизацию. Просто в данном курсе у нас простые задачки, для понимания
Wl.7 уровень
29 апреля, 20:07
Спасибо.
Sergey13 уровень
17 марта, 06:58
+ 1 шаг к цели "Стать Java-программистом"
Александр9 уровень, Москва
30 апреля, 13:10
Зачем пишешь в каждом уровне это? напиши табличку и повешай на грудь себе, если тебе от этого легче, нечего чат флудом заполнять
Rina14 уровень
8 марта, 19:28
initialize и метод setName выглядят совершенно одинаково. В чем разница между ними?
Sergey13 уровень
17 марта, 06:50
setName - устанавливает значение поля name, устанавливать можно сколько угодно раз в коде. initialize - устанавливает первоначальное значение (инициализирует) поля name и, можно сказать, что переводит объект в валидное состояние, т.е. в состояние, при котором объект в дальнейшем можно использовать.