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

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

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

Комментарии (380)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Vitalik
6 уровень, Минск
18 февраля, 14:42
Это же перегрузка методов? Когда одинаковое имя и разные параметры
Valua Sinicyn
41 уровень, Харьков
19 февраля, 15:55
Либо порядок параметров. Т.е.,
foo(String s, int x);
и
foo(int x, String s);
это два перегруженных метода.
Тимур Акматов
10 уровень
17 февраля, 22:11
я кажется понял,для чего нужен метод initialize(). он нужен для инициализации нескольких разных полей при различных принимаемых параметров. это удобно, чем вызывать сеттер для каждого поля. Понимание пришло после выполнения задачи "кошкоинициация". Впринципе так же можно сделать и с сеттером, НО сеттер на то и сеттер, чтобы изменять только одно конкретное поле.
Valua Sinicyn
41 уровень, Харьков
19 февраля, 13:10
На будущее, лучше запомнить, что параметры принимают атрибуты. Можно, конечно, использовать определения "принимающие значения параметры" и "передающие значения параметры", но общепринято так, как выше.
public static void main(String[] args){
  new Person("Вася", "Куралесов");  // атрибуты
}
class Person{
  String name, surname;
  Person(String name, String surname){  // параметры
    name = name;
    surname = surname;
 }
}
Тимур Акматов
10 уровень
20 февраля, 13:37
спасибо! запомню, методы имеют параметры и принимают атрибуты в эти параметры
Kurban Gamzatov
7 уровень, Ivanovo
22 февраля, 17:00
а разве не надо перед name и surname ставить this или это что-то другое ?(this.name = name;)
Valua Sinicyn
41 уровень, Харьков
23 февраля, 09:53
Лучше ставить. Но, можно и не ставить. В коде с иерархией классов, лучше ставить. Нагляднее.
Kurban Gamzatov
7 уровень, Ivanovo
28 февраля, 11:51
понял , спасибо
Вадим
10 уровень, Москва
17 апреля, 22:51
В таком виде надо ставить this, так как параметы совпадают полями класса
enot
18 уровень
13 февраля, 14:15
В данной лекции разбирается один из способов инициализации переменных в классе. Есть следующие способы инициализации (явное или неявное установление некоторого значения переменной) 1. инициализация по умолчанию (неявная инициализация). Это когда мы объявляем некоторую переменную, например: int a; По-умолчанию ей будет присвоено значение a = 0; 2. явная инициализация начальными значениями (константными значениями). Это когда мы явно указываем в коде: int a = 0; или: int a; a = 0; 3. явная инициализация методами класса. Вот именно это и приводится в данной лекции. Вызывается после создания объекта класса. Т.к. сюда весь текст не помещается, ниже будет пример. 4. инициализация с помощью конструкторов классов. Будет разобрано в следующих уроках. Если вкратце, то по сути та же инициализация методом класса, только этот метод должен иметь совпадающее с именем класса имя, не иметь никакого возвращаемого значения (даже void нельзя писать) и метод вызывается в момент создания объекта класса, т.е. как только мы пишем что-то вроде new OurClass(); вызывается конструктор класса.
enot
18 уровень
13 февраля, 14:24
Обещанный выше пример:
public class Rectangle
 {
     int length;
     int breadth;
// пример инициализации параметров a и b с типом int.  методом.
// Метод вовсе не должен иметь имя initialize(), как видно из данного примера, имя метода perValue()
    void perValue(int a, int b)
    {
      length = a;
      breadth = b;
   }
void calculate()
 {
    int perimeter = 2*(length + breadth);
    System.out.println("Perimeter of the Rectangle:" +perimeter);
 }

public static void main(String[] args)
  {
 // создаём объект класса
      Rectangle rt = new Rectangle();
      rt.perValue(20,30);  // вот как раз тот самый метод initialize(), который мы и разбираем в теме. Просто инициализирует переменные класса.
      rt.calculate(); // вызываем метод объекта. Теперь мы это можем сделать, потому что переменные объекта имеют свои значения (проинициализированы)

    Rectangle rt2 = new Rectangle(); // второй объект класса
      rt2.perValue(50,50); // инициализируем его переменные
      rt2.calculate();
   }
 }
Valua Sinicyn
41 уровень, Харьков
19 февраля, 12:52
Во 2-м пункте, то, что вы называете константами, на самом деле литералы.
Justinian Judge в Mega City OneMaster
10 марта, 21:13
Здесь я вынужден поправить, поскольку Valua Sinicyn запутался и пытается путать других. Топикстартер, enot писал о инициализации начальными значениями (константными значениями //constant value). Это литералы. Здесь все правильно. вот здесь к примеру: int number = 6; 6 - это константное значение, которое обозначается термином литерал. Valua Sinicyn же говорит за константные переменные, которые он сокращает до слова константы, то есть constant variable. Это неизменяемые переменные с постоянным значением: private static final String USER_EMAL = "beltaloda@svp.com" здесь именно USER_EMAIL будет константой (константной переменной). В джаве, как и в большинстве языков программирования, сущности value != variables, пусть хоть каждая из этих сущностей бывает константной. Если говорить о определениях: JLS говорит, что литерал это представление в исходном коде значений примитивного типа, String или null. То есть, литерал, это некое константное/постоянное значение указанное в джава коде. Если мы пишем в коде: int number = 54; String s = "Amigo"; boolean isSorted = true; char ch = 'z'; подчеркнутое - это литералы. Почему они постоянные/константные? А они меняются? Если мы указали 5, может на этапе компиляции там станет 6, или при выполнении кода станет 7? Нет, сам литерал отображает постоянное/константное значение. Значение самой переменной безусловно может измениться, но не литерал. Есть константа, константная переменная, constant variable, это переменная, значение которой не может измениться после того, как было определено. То есть, в каком участке программы мы бы не вызвали переменную USER_MAIL, к примеру, мы уверенны, что она будет обозначать конкретное значение. Есть еще константные выражения, constant expression, например: int number = 2 + 2; String s = "Masha" + "Petya"; это выражения, резул может быть сведен к литералу (в данном случае - 4 и "MashaPetya" соответственно
Valua Sinicyn
41 уровень, Харьков
11 марта, 14:44
Можешь кинуть линк на оригинал ?
Valua Sinicyn
41 уровень, Харьков
11 марта, 14:59
Не, так не пойдет: пойди, почитай... Почитал, в оригинале, не нашел ни слова о "константных значениях. JLS
Valua Sinicyn
41 уровень, Харьков
11 марта, 16:41
Трудно найти черную кошку в темной комнате, особенно, если там ее нет.
Valua Sinicyn
41 уровень, Харьков
12 марта, 08:29
С тобой никто не спорил. Нет времени или желания на поиск линка, так и скажи. Надеюсь дизайн у тебя выходит лучше менторинга. Удачи.
Valua Sinicyn
41 уровень, Харьков
12 марта, 11:51
Ты сюда заходишь свое ЧСВ поднимать ? Я не понимаю смысл твоих постов. Тебе был задан один простой вопрос: дать линк на док. Вместо этого ты начал сыпать иносказаниями, рассказами про архитекторов и дизайн. Даже город в твоей личке скрыт под ник: Mega City One. Это Нью Йорк, Сызрань, Адис а Беба ? Теперь вот, пошли обрывки фраз и смайлики. Что дальше ? Начнешь постить фотожабы ? После общения с тобой, стойкое впечатление, что постит школьник на мамкином компе.
Valua Sinicyn
41 уровень, Харьков
12 марта, 16:05
В чем ересь ? Что первоначально присваимое значение именуется литералом ? Ты совсем север с югом попутал ? Пока не дашь линк на доки с "константным значением", ересь это твои посты. Честно, я бы уже на принцип нашел.
Valua Sinicyn
41 уровень, Харьков
13 марта, 17:06
Молодца ! Свалил примитивы и immutable строки в одну кучу. Хотя бы замени примитивы на обертки, не так будет резать глаз. Про линк на доки, естественно, забыл ? ) Да, и никто не говорит константная переменная, как и ссылочная или примитивная переменная (ну, кроме тебя), константа, ссылка, примитив. Апд., Замени String на StringBuilder, вызови append и ты увидишь как меняется значение строки (если примитив для тебя не очевиден). Затем подумай, о каком "константном значении" в этом случае, может идти речь ? Логика же. Либо дай ссылку на док.
Уравнитель наказываю скам в javaраше
16 апреля, 17:58
Это же судья, у него походу какая-то дневная норма есть на случайные водянисто-графоманские посты, дабы своё эго потешить. Судя по переписке, каменты он свои потёр и катапультировался, когда слился на аргументации.
Жора Нет
16 уровень, енакиево
17 января, 15:45
Чем тогда метод initialize(); отличается от set(); ???
ASY
17 уровень
18 января, 17:48
Количеством аргументом метода, у Set, согласно конвенции всегда один.
Egir
11 уровень, Ростов на Дону
9 января, 08:09
Для чего нужно декларировать переменную экземпляра явно ? Если она и так инициализируется по умолчанию. И еще invalid (инвалид ) и valid .Как трактовать эти понятия? Понял так,что бы объект стал valid( т.е.дееспособным) ,нужно присвоить ему ссылку на переменную экземпляра ,т.е указать явно через this тогда с ним можно работать ,а если метод пустой то invalid,но вопрос тогда другой .Зачем вообще создавать пустой метод ?
Egir
11 уровень, Ростов на Дону
6 января, 15:30
Такой вопрос ,зачем нужно в аргументах(параметры) метода initialize(имя класса) писать имя КЛАССА?
Марат
27 уровень, Москва
8 января, 05:24
Если ты про этот кусок кода:
// Файл filename будет находиться в той же директории, что и file.
    public void initialize(MyFile file, String name)
    {
        this.filename = file.getFolder() + name;
    }
то в параметрах метода всегда указывается тип передаваемого значения (в данном случае объектов). "MyFile" и "String" это тип передаваемого значения и оба они являются объектами. И если прописать:
public void initialize(int file, String name)
{
    this.filename = file.getFolder() + name;
}
то это будет уже новый метод, использующий в качестве принимающих параметров переменную int и объект String. Класс String в Java Методы в Java
Карбофос Огарин
14 уровень, Санкт-Петербург
27 декабря 2020, 21:19
Кто нибудь может объяснить зачем на практике нужен метод Initialize ? Я таки не понял...
Валерий Пантелеев
12 уровень, Тюмень
3 января, 13:41
Это рукотворный конструктор))
Артур Жуков
32 уровень, Астана
27 января, 10:03
Я тоже не понял. Это бред, для этого есть конструктор
Andrey
7 уровень, Уфа
19 февраля, 06:14
Используя конструктор, можно добиться того, чтобы поля класса были обязательными для заполнения. Инициализаторы этого не гарантируют. Это просто инструмент, позволяющий заполнить какие-то из полей. Например, чтобы соседний класс мог заполнять поля каким-то из объектов этого класса
Justinian Judge в Mega City OneMaster
10 марта, 21:22
конструктор вызывается один раз при создании объекта и может иметь те или иные ограничения по уровню доступа, аргументам. Инициализаторы можно вызывать после создания объекта, часто это имеет смысл в тех или иных случаях. Не так просто привести реальные примеры, поскольку использование инициализаторов вызвано сложной логикой в многокомпонентных системах, поэтому пока достаточно знать что такая штука есть. Всему свое время, все сложится.
Sergio
6 уровень
26 декабря 2020, 21:09
Я вот не понял - в самом последнем примере, не должны ли быть ошибки, поскольку мы создаем якобы копию файла, но имя одно и тоже - file a.txt, file2 a.txt
Сергей
22 уровень
24 декабря 2020, 12:34
Слишком мало информации про методы, тупо есть метод initialize дальше пишется так и все тут "Имя файла, с которым этот объект будет работать? — Правильно. Для этого добавим в наш класс метод initialize(). Это будет выглядеть примерно так:" ... А где объяснение действия самого метода? Есть машина и она поедет (у нее есть двигатель), но ка она поедет не описано. Есть книга "современное программирование на С++", хоть на языке С но логику отлично объясняет, все понятно от чего что появляется, что делает и куда исчезает.
Алексей
6 уровень
15 апреля, 07:37
Это фишка JavaRush - " поменьше информации". Типа, сами допетрите, не маленькие....
Vieri
9 уровень
27 ноября 2020, 05:27
Пришло понимание этой лекции после прочтения следующих комментариев: https://javarush.ru/help/18811
Angelina Ageeva
23 уровень, Симферополь
2 декабря 2020, 14:03
Большое спасибо! Очень помогло!