29 авг. 2015 г.

Внутренние классы. Часть 6 – практика.

Сперва поупражняемся по мотивам видео представленного ниже.

Inner classes

Очень хороший урок и объяснение внутренних классов и так же удачный пример.

InnPr0001Собственно это мое повторение примера приведенного в видео.

По большому счету здесь и объяснять то нечего, так как в видео все разжевано дальше не куда :)

Единственное на что стоит снова обратить внимание так это на то, что для внутренних классов доступны все поля и методы внешнего класса, даже те что объявлены как private.

Именно поэтому в методах getAmount() и toDeposit() класса Card можно напрямую обратиться к private полю amount.

И катати, да, :) я случайно засунул этот пример в пакет anonym05. Хочу заметить что к анонимным классам данный пример ни какого отношения не имеет :) просто лень его было уже переносить в другой пакет :)

Ну и вывод программы:

InnPr0003

Из вывода программы видно, что изменения производимые через объект внутреннего класса изменяют поле amount объекта внешнего класса.

Ну и чтобы все стало еще более понятно приведу скриншот класса Main:

InnPr0002

Надеюсь это уже все поставит на свои места.

Сперва создаем экземпляр класса Account – father.

Затем выводим на консоль его состояние.

После создаем экземпляр класса Card – mother.

Выводим его состояние на консоль.

Затем через mother снимаем со счета 18 у.е. :)

Выводим состояние счета через экземпляры классов Account  и Card. Видим что оно одинаковое. Как и должно быть.

Пополняем счет через мамочку на 8 у.е., выводим на консоль. Пополняем через папочку на 10 у.е., выводим на консоль.

Все работает как и ожидалось, как и должно было работать.

 

В следующем примере мы повторим программу из этой статьи, но только уже с использованием анонимного класса.

InnPr0004

InnPr0005

В единственном методе start() класса Clock, анонимный класс имплементирует интерфейс ActionListener. В данном случае это просто вывод текущего времени на экран. Затем создается объект таймера куда как параметры передаются ссылка на нашу реализацию интерфейса и время через которое будет срабатывать его метод (в нашем случае 1сек.). В метод start так же передается boolean параметр, если он true, то будет еще выводится и линия после вывода времени.

Заметьте, что передаваемый параметр boolean сопровождается модификатором final, хотя если вы используете JDK8, то это не обязательно. Главное чтобы он не изменялся в методе start().

InnPr0006Теперь с новыми знаниями об анонимных классах перепишем пример фабричного метода, который мы уже писали тут. Весь код на скриншоте я приводить тут не буду. Разницу между этим и предыдущим можно посмотреть перейдя по линкам. Но сразу можно сказать что текущий пример стал куда короче.

На скриншоте приведет пример имплементации обоих интерфейсов. Причем имплементация ServiceFactory сделана при помощи анонимного класса, что очень уменьшило объем кода.

InnPr0007

Вывод программы представлен слева.

Чтобы все стало более понятно приведу ниже еще и код создания наших "продуктов".

 

InnPr0008

Тут приведен отрывок из кода, который создает наши "продукты" и вызывает на них методы.

Принцип тут тот же, что был описан тут. Это кстати тоже пример (немного переделанный мной) из книги "Философия Java". Хотя там все реализовано было через статическое поле, но я решил сделать чуть по другому :) Чтобы можно было задать имя сервиса и вывести его.

Вроде бы с этим примером все :)

 

Теперь еще повторим пример фабричного метода с игрой, но уже с анонимными классами. Тут уже не буду приводить отрывков кода, просто можно перейти по линкам и сравнить эти два примера.

InnPr0009

И еще один пример итератора с использованием анонимных классов.

Это переделанный вариант кода который мы писали тут.

Вывод у программы не изменился:

InnPr0010

Единственное что мы сделали при помощи анонимного класса, так это сражу же в объявлении метода selector() избавились от необходимости создавать отдельный класс SequenceSelector.

В результате этого код стал чуть поменьше и чуть попонятней. А может и менее понятней :), но интересней и занятней :)

Сейчас метод selector() возвращает ссылку на экземпляр анонимного класса приведенную к типу интерфейса ISelector.

И затем через методы анонимного класса происходит вывод значений хранящихся в items. То есть еще раз демонстрируется, что для внутренних классов доступны даже private члены внешнего класса.

2 комментария:

  1. Спасибо еще раз. Пока самый полезный блог на блогспоте =) , а еще что-то по джаве будет?

    ОтветитьУдалить
  2. Пожалуйста. И да конечно будет. Просто как время будет продолжу блог.

    ОтветитьУдалить