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

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

Комментарии (239)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Алексей7 уровень, Москва
13 февраля, 18:44
В чем разница записей
private String filename = null;
и
private String filename; //Когда мы пишем вторым способом у нас null в filename?
Драконя 5 уровень
16 февраля, 15:43
в первом случае ты инициализируешь, т.е. определяешь значение у переменной. во втором стринга имеет статус unknown, что может ломать программу( это другой тип значений) Ради эксперимента попробуй не проинициаизированную переменную вывести в консоль и посмотри что напишут в стектрейси=)
Алексей7 уровень, Москва
13 февраля, 18:30
Чем инициализаторы отличаются от конструкторов? Здесь используется перегрузка методов?
Psiholirik7 уровень, Мариуполь
15 февраля, 20:43
Конструктор - используется единоразово при создании объекта.
public static class Cat{
        String name;
        int age;

        public Cat(String name, int age) {
            this.name = name;
            this.age = age;
        }
А инициализатор можно использовать когда это необходимо, это просто метод класса.
public void initialize(String name, int age) {
        this.name = name;
        this.age = age;
}
Насколько я понял - работает как сеттер, но тут сразу несколько переменных. И все это для того, чтобы те кто будут использовать твой код понимали что делают эти методы, ведь по сути setName и initialize ты можешь назвать как хочешь. .
Алексей9 уровень, Хабаровск
3 февраля, 09:47
Уфф - радует что я не один ничего не понял, точнее понял что не понял, или что понял - не понял, ну или наоборот не понял что понял.. в общем надеюсь вы меня поняли ))) initialize это что бы инициализировать! 😬
Алексей Владимирович Плотников8 уровень, Санкт-Петербург
21 января, 22:31
Несколько раз прочитал... нифига не понял((( Хоть что-то начал догонять только после "Кошкоинициация". Норм задача)))
Илья Идущий16 уровень, Москва
8 января, 12:40
Я правильно понял, что в последнем примере создают файл в определенной директории, затем создают второй файл, беря путь к директории из первого файла? И в итоге создают два файла с одинаковыми именами в одной директории?
维克多 船长6 уровень, Москва
8 января, 18:36
Ну вообще, судя по коду, два файла не создаётся и даже один не создаётся. В последнем примере создаётся два объекта, которые ссылаются на название одного и того же файла в одной и той же директории.
Alexander Popov10 уровень, Санкт-Петербург
2 января, 14:36
Конструктор же для того же предназначен?Вернее он может выполнять те же функции ,что и initialize?
维克多 船长6 уровень, Москва
8 января, 19:06
Конструктор создаёт объект и может инициализировать поля при создании. Метод initialize() не создаёт объект, а только инициализирует уже созданный объект
Андрей Хорошилов9 уровень, Москва
29 января, 06:34
Вот я тоже не понял. Сначала говорят, что бессмысленно создавать файл без имени и тут же разделяют создание и присвоение имени.
Евгений5 уровень, Санкт-Петербург
5 февраля, 09:33
возможно я ошибаюсь, но разве конструкторы не используются в абстрактных классах в том числе без создания объектов, а лишь для задания их поведения?
Justinian41 уровень, Киев
16 февраля, 21:06
конструктор не создает объект. Объект создается при помощи ключевого слова new, когда отрабатывает конструктор, объект уже создан, хотя тут вопрос что считать созданием объекта. При использовании слова new, выделяется память и начинается ПРОЦЕСС создания объекта который включает в себя много стадий, одна из которых это отработка содержимого конструкторов. Именно поэтому абстрактные классы имеют конструкторы, для задания состояния объекта, они просто участвуют в процессе создания объекта, помогают задать определенное состояние. То есть фактически, этот тот же метод initialize, просто синтаксически усиленый тем, что он обзятельно будет вызван ПРИ создании объекта, есть ряд требований (не указывается тип возвращаемого значения, имя конструктора должно совпадать с именем класса) и тд.
Сергей7 уровень, Гомель
25 декабря 2019, 13:30
Подскажите зачем использовать метод initialize() ? если можно создавать переменные без явного присвоения значения null. Например: в классе class MyFile { String s; int a; и т.д } Объясните пожалуйста зачем этот метод нужен?
Ирина Чертихина8 уровень, Москва
30 декабря 2019, 07:22
Вот тот же вопрос возник, и в сети не очень-то понятно. К счастью, здесь ответили: Regina 40 уровень, Киев: Конструктор, в отличие от метода initialize, можно вызвать только один раз. И если, например, в классе нужно поменять какие-то поля, то сделать это можно через метод initilize, а не через конструктор. Алексей17 уровень, Полысаево Метод initialize нужен для скидывания значений в умолчания, чаще всего именно так используют, чтобы выставить значения по умолчанию в любом месте программы, столько раз, сколько необходимо(по сути, это многоразовый конструктор).
Сергей7 уровень, Гомель
30 декабря 2019, 19:14
Спасибо за помощь 🙂
titix6 уровень
1 января, 23:20
а чем это отличается от сеттера?
Сергей7 уровень, Гомель
5 января, 10:05
Действительно в чём отличия? Ирина
维克多 船长6 уровень, Москва
8 января, 19:03
Технически этот метод от сеттера не отличается. Но, допустим, в твоём классе пять полей и надо им всем установить значения. Ты можешь конечно вызывать сеттер для каждого поля, но вызывать пять сеттеров слишком громоздко. Гораздо проще вызвать метод initialize() и передать туда пять параметров. Можно конечно сделать и сеттер, который установит значения всех пяти полей. Но как ты его назовёшь? В случае с одним полем его можно назвать setName() например и всем понятно что это за метод. А в случае пяти? Поэтому и существует метод initialize(). То есть простыми словами он имеет фиксированное название, понятное всем программистам. Любой другой программист будет интуитивно понимать что делает этот метод.
Ирина Чертихина8 уровень, Москва
15 января, 07:32
А от сеттера это отличается тем, что можно инициализировать сразу много переменных, а не одну
Fregat8 уровень, Днепр
17 января, 20:56
Не совсем так!) Сеттер это самый обычный метод. Который, как правило, все программисты используют для изменения одного конкретного поля, где в названии метода используется "подсказка" set(изменять) + имя переменной(той которую меняем, хоть с большой буквы писать хоть с маленькой, по привычке пишут с большой, так удобней) Ничего не мешает сделать сеттер с несколькими переменными
public class Test {
    private String name;
    private int age;

    public void setOne(String name, int age){
        this.name = name;
        this.age = age;
    }
    public static void main(String[] args) {
        Test test1 = new Test();
        test1.setOne("Hi", 25);

    }
}
Просто когда видим сеттер и геттер, то программист понимает какое поле будет менять, и как правило оно одно. А метод initialize(). (и назвать то его можно хоть varigkajha() хоть babocha(), как угодно, главное правильно его реализовать.), используется чтобы менять несколько полей за раз, ведь в сеттере, мы, как правило, одно поле можем изменить, а конструктор вообще раз используется при создании объекта. initialize(). - инициализировать!, так удобно звучит и понятно программистам, что можно сделать в этом методе. set/get/initialize - не резервируются в java, в отличии от main / boolaen(true/false) / int и т.д. Комментарий человека перед вашим - всё прям по полочкам разложил) А я возможно и не прав буду, если что поправляйте, сам только начал изучение по сути Удачи всем в изучении!)
Юрий12 уровень, Кишинёв
21 декабря 2019, 12:51
Вот видео по теме: https://www.youtube.com/watch?v=TdvnGw_KcFY вроде разобрался, но нужна практика для закрепления. Иду дальше рвать задачки... и первую задачку решил за 2 минутки с первой попытки, не сложно - главное разобраться зачем все это :)
Danir8 уровень, Лиссабон
22 января, 22:32
А Я все задачки решил за пару минут, так и не разобравшись зачем это...
12 декабря 2019, 19:16
А как проверить упражнение на ввод кода в этой лекции? Я после перерыва что-то забыл.
Олег Малахов7 уровень, Санкт-Петербург
13 декабря 2019, 10:57
Если Вы вводите полный правильный текст - упражнение завершается автоматически после ввода последнего символа, и Вам начисляется 2 единицы тёмной энергии. Если в ходе упражнения Вы допускаете ошибку - поле ввода текста подсвечивается красным, и завершение упражнения становится невозможным.
19 декабря 2019, 22:00
Спасибо. А что за глюк, что написано всё правильно, а упражнение не завершается? Может что-то с раскладкой? Все строки подсвечены красным.
Олег Малахов7 уровень, Санкт-Петербург
20 декабря 2019, 10:00
В данной ситуации наиболее вероятный вариант в том, что Вы всё-таки ошиблись при вводе. Если визуально текст полностью соответствует образцу - проверьте на наличие лишних пробелов и символов, введённых в другой раскладке. Хотя, проще будет просто перенабрать его заново.
Сергей7 уровень, Гомель
26 ноября 2019, 22:11
Объясните пожалуйста подробнее про директории непонятно // Файл filename будет находиться в той же директории, что и file. - в какой директории находится переменная filename ? public void initialize(MyFile file, String name) - и здесь не понятно что делает MyFile file в параметрах метода initialized??? { this.filename = file.getFolder() + name; }
Whiskazzz20 уровень, Санкт-Петербург
3 декабря 2019, 18:53
в какой директории находится переменная filename? Как бы тупо не звучало, но в той же что и file. Т.е. у нас есть некая папка где файл с именем file и мы туда же запихиваем filename(это собственно имя файла, который мы создали). и здесь не понятно что делает MyFile file в параметрах метода initialized??? Мы передаем в фунцию объект в качестве параметра. Т.е. это как передать Int chislo.
Сергей7 уровень, Гомель
4 декабря 2019, 11:32
Спасибо за помощь