undefined

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

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

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

Комментарии (368)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Vitalik 6 уровень, Минск
18 февраля 2021
Это же перегрузка методов? Когда одинаковое имя и разные параметры
Тимур Акматов 9 уровень
17 февраля 2021
я кажется понял,для чего нужен метод initialize(). он нужен для инициализации нескольких разных полей при различных принимаемых параметров. это удобно, чем вызывать сеттер для каждого поля. Понимание пришло после выполнения задачи "кошкоинициация". Впринципе так же можно сделать и с сеттером, НО сеттер на то и сеттер, чтобы изменять только одно конкретное поле.
enot 9 уровень
13 февраля 2021
В данной лекции разбирается один из способов инициализации переменных в классе. Есть следующие способы инициализации (явное или неявное установление некоторого значения переменной) 1. инициализация по умолчанию (неявная инициализация). Это когда мы объявляем некоторую переменную, например: int a; По-умолчанию ей будет присвоено значение a = 0; 2. явная инициализация начальными значениями (константными значениями). Это когда мы явно указываем в коде: int a = 0; или: int a; a = 0; 3. явная инициализация методами класса. Вот именно это и приводится в данной лекции. Вызывается после создания объекта класса. Т.к. сюда весь текст не помещается, ниже будет пример. 4. инициализация с помощью конструкторов классов. Будет разобрано в следующих уроках. Если вкратце, то по сути та же инициализация методом класса, только этот метод должен иметь совпадающее с именем класса имя, не иметь никакого возвращаемого значения (даже void нельзя писать) и метод вызывается в момент создания объекта класса, т.е. как только мы пишем что-то вроде new OurClass(); вызывается конструктор класса.
Жора Нет 9 уровень, енакиево
17 января 2021
Чем тогда метод initialize(); отличается от set(); ???
Egir 11 уровень, Ростов на Дону
9 января 2021
Для чего нужно декларировать переменную экземпляра явно ? Если она и так инициализируется по умолчанию. И еще invalid (инвалид ) и valid .Как трактовать эти понятия? Понял так,что бы объект стал valid( т.е.дееспособным) ,нужно присвоить ему ссылку на переменную экземпляра ,т.е указать явно через this тогда с ним можно работать ,а если метод пустой то invalid,но вопрос тогда другой .Зачем вообще создавать пустой метод ?
Egir 11 уровень, Ростов на Дону
6 января 2021
Такой вопрос ,зачем нужно в аргументах(параметры) метода initialize(имя класса) писать имя КЛАССА?
Карбофос Огарин 9 уровень, Санкт-Петербург
27 декабря 2020
Кто нибудь может объяснить зачем на практике нужен метод Initialize ? Я таки не понял...
Sergio 6 уровень
26 декабря 2020
Я вот не понял - в самом последнем примере, не должны ли быть ошибки, поскольку мы создаем якобы копию файла, но имя одно и тоже - file a.txt, file2 a.txt
Сергей 22 уровень
24 декабря 2020
Слишком мало информации про методы, тупо есть метод initialize дальше пишется так и все тут "Имя файла, с которым этот объект будет работать? — Правильно. Для этого добавим в наш класс метод initialize(). Это будет выглядеть примерно так:" ... А где объяснение действия самого метода? Есть машина и она поедет (у нее есть двигатель), но ка она поедет не описано. Есть книга "современное программирование на С++", хоть на языке С но логику отлично объясняет, все понятно от чего что появляется, что делает и куда исчезает.
Vieri 9 уровень
27 ноября 2020
Пришло понимание этой лекции после прочтения следующих комментариев: https://javarush.ru/help/18811