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

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

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

2
Задача
Java Syntax,  5 уровень,  6 лекция
Недоступна
Набираем код Ӏ Java Syntax: 5 уровень, 6 лекция
Java Syntax: 5 уровень, 6 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.
Комментарии (317)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Андрей5 уровень, Красноярск
позавчера, 09:49
После первой же задачи в следующей лекции приходит понимание, вернитесь сюда как начнёте решать задачи и дополнительно создайте объект в мейне. Например: Test1 man = new Test1(); man.initialize("Bib", 25, 'y');
Vladrip5 уровень
позавчера, 02:54
Разве нельзя написать в методе (String filename) { this.filename = filename }, зачем создавать новую переменную? Пойду ка я книги почитаю наверное —_—
Udjin12 уровень, Москва
27 июля, 16:43
MyFile file = new MyFile();
file.initialize("c:\data\a.txt");

MyFile file2 = new MyFile();
file2.initialize(file, "a.txt");

String text = file2.readText();
Я правильно понимаю, что здесь создается файл a.txt в папку, где файл с таким именем уже есть?
Magdaleon13 уровень
27 июля, 17:48
// Файл filename будет находиться в той же директории, что и file.
Нет, имена у файлов могут быть разные (даже расширения), но директория будет одна. Метод getFolder в переопределенном методе initialize возвращает путь к папке, в которой лежит файл, а затем мы прибавлем к нему уникальное имя файла "a.txt".
Udjin12 уровень, Москва
27 июля, 18:22
Да, общую теорию я понимаю, что можно задать любое имя файла. Я спрашиваю конкретно про данный пример. В нем, как я понимаю, создается файл с таким же именем, который уже есть.
Павел Ковыршин11 уровень, Санкт-Петербург
28 июля, 09:23
В данном примере файлы вообще не создаются. Инициализируются объекты для чтения заданного файла.
Серега5 уровень, Кривой Рог
25 июля, 19:20
https://www.youtube.com/playlist?list=PLyApprAtr5yjywFgRkxhfGfesgYoIhU8U
Олеся9 уровень
19 июня, 09:56
И совсем не понятно, если уже написали конструктор для класса, тогда public void initialize нужен или он уже лишним будет? И вроде понятно зачем нужен public void initialize, ток не понятно когда, в каких случаях он нужен и как он дружин или не дружит с конструктором :(
Антон15 уровень, Санкт-Петербург
17 июня, 15:47
А в чем отличие метода initialize от конструктора? Ведь если создать соответствующие конструкторы, то задавать необходимые параметры можно непосредственно при создании объекта. А зачем тогда нужен метод initialize? Непонятно...
Антон15 уровень, Санкт-Петербург
17 июня, 16:39
Вопрос отпал. Дальше разъясняется.
Shdbdbd Susjebj9 уровень
16 июня, 23:10
В чем отличие конструкции initialize от Setter? Вроде один и тот же алгоритм, только названия разные.
Dzyuba Andrey7 уровень
7 июня, 12:21
Не совсем понял, зачем нужен initialize, если есть стандартные сеттеры, которые делают, как я понял, то же самое. Видимо, разница в том, что initialize может принимать несколько параметров, а стандартно сгенерированный сеттер принимает только один?
Dennis Sankin8 уровень, Санкт-Петербург
8 июня, 11:02
если сеттер это конструктор, то конструкторов также может быть несоклько
Justinian41 уровень, Киев
12 июня, 11:17
сеттер, это конструкция задача которой, изменять/устанавливать значение ОДНОЙ переменной. Конструкторы и методы initialize это конструкции, которые используются для придания экземпляру объекту определенного состояния. Они могут устанавливать значение 0, 1 или 10 переменным. Допустим у нас есть класс Кот:
class Cat {
  private String name;
  private String ownerName;
  private int age;
  private Color color;
}
Если мы создаем кота:
Cat cat = new Cat();
То что создается? Сферический кот в вакууме, без состояния. Он как бы кот по типу. Но его как бы и нет - безымянный, без хозяина, без цвета и тд. Если бы были сеттеры, то это было бы так:
class Cat {
    private String name;
    private String ownerName;
    private int age;
    private Color color;

    public void setName(String name) {
        this.name = name;
    }

    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setColor(Color color) {
        this.color = color;
    }
}
и мы могли бы сделать так:
Cat cat = new Cat();
cat.setName("Barsik");
cat.setAge(2);
cat.setOwnerName("Vasiliy Petrovich");
Color red = new Color();
cat.setColor(red);
Вот, мы создали объект, мы задали ему состояние, теперь это не абстрактный кот в пальто. Это конкретный кот Барсик, с возрастом 2 года, рыжего цвета, с конкретным хозяином. Класс сам по себе абстрактная схема, чертеж нашего объекта. Поэтому вроде и логично что если мы просто создаем объект, то это должна быть заготовка, которой мы вручную зададим что нам нужно. Для этого и предназначены объекты, мы их создаем и подгоняем под себя, что нужно. Но есть одно но.
Justinian41 уровень, Киев
12 июня, 11:27
Суть в том, что сама концепция конструкторов и методов инициализаторов, состоит в том, чтобы когда мы создаем объект, он был валидным котом. Что имеется в виду.
Horse horse = new Horse();
Cat cat = new Cat();
Human human = new Human();
чем эти созданные объекты отличаются? (при условии что не задаются дефолтные значения). Они будут аморфные, они будут сферическими сущностями в вакууме. Ну да, тип конь, или кот. Но кроме типа у них ничего нет по сути. И главное. По умолчанию поля класса заполняются нулями для числовых примитивов, и null для ссылочных типов. Это значит, что вполне можно создать Car car = new Car(); и длина, высота, ширина будет равна 0. Но это невозможно! Не может существовать автомобиля как реального объекта, с размерностью 0. Или кота без цвета. Поэтому суть конструкторов/инициалиазаторов, состоит в том, чтобы задать определенные необходимые и важные (с точки зрения программиста и бизнес-логики) характеристики, чтобы да, пусть у кота не будет имени, пусть он будет беспородный. Но если есть графа вес, графа длина , цвет и тд, чтобы были какие-то валидные, корректные значения. Пусть это будет мурчиком-беспризорником, но это уже будет котом. А не сферическим нечто в вакууме. Напрашивается вопрос, мы же можем так написать:
class Cat {
    private String name;
    private String ownerName;
    private int age;
    private Color color = new Color();
    private int weight = 3;
да, мы можем напрямую дефолтные значения записывать, но так не делают по разным причинам. А делают, конструкторы (используются в основном) и инициализаторы (метод initialize). Инициализаторы изучаются для понимания сути конструкторов. Конструктор используется один раз при создании объекта. Метод инициализатор можно использовать хоть 100 раз.
java.robots.Bender18 уровень, Набережные Челны
16 июня, 19:57
нет, сеттер это сеттер, он может выглядеть с любым именем, для наглядности используют только set*имя переменной*() Конструктор же всегда совпадает с именем класса и вызывается он в любом случае.
Gatis7 уровень, Рига
25 июня, 15:04
Razve konstruktor nenosit imja klasa?
java.robots.Bender18 уровень, Набережные Челны
26 июня, 13:51
все верно - класса, инфы много, думаешь об одном пишешь другое
Valua Sinicyn16 уровень, Харьков
1 июня, 06:01
Метод initialize() - универсальный сеттер. Метод initialize() - аналог конструктора, но в отличие от последнего, практически не используется. Это все, что нужно знать о методе initialize().
Юрий23 уровень, Москва
30 мая, 20:10
Время шло, а он все инициализировал и инициализировал кошек.