Классы-оболочки

  • Автор темы Louis
  • Дата начала
L

Louis

Гость
#1
Никак не могу понять что это и для чего нужно....

Смотрю в книгу и вижу фигу...


Може тко-то обяъснит на пальцах??
 
Y

Yason

Гость
#2
Louis
Disclaimer: предполагаю, что речь идёт не о primitive wrapper class (а-ля Byte, Integer и т.п.)

Пример.
Есть волк, его нужно "внедрить" в стадо овечек, причём так, чтобы они ничего не заметили.
Берём волка, оборачиваем в овечью шкуру - и все довольны (до поры :) )

Пример-2.
Пожилым людям сложно разбираться с мобильными телефонами - мелкие картинки, сложная структура меню, и т.п.
Для них удобнее был бы девайс в виде трубки без экрана, и с парой кнопок: "Позвонить сыну", "Позвонить мужу" и.т.п. По-сути, для этого можно использовать любой мобильник, настроив быстрый набор, заклеив экран, и убрав лишние клавиши.
Т.е. завернуть сложный девайс в "оболочку", чтобы с ним было удобнее работать.

На пальцах.
Вашей программе необходимо работать с динамическим массивом объектов типа MySuperPuperClass, причём нужны только методы add, get, size и clear.
Классическое решение (временно забудем про версию 1.5) - использовать java.util.Vector и приведение типов а-ля (MySuperPuperClass)myVector.get(...).
Но.
Во-первых, доступными остаются все public методы Vector'а (что нехорошо, нам нужно только четыре); во-вторых, это неудобно набирать; в-третьих, это нечитабельно.
Решение - создать свой класс MySuperPuperVector, который будет иметь public-методы add, get, size и clear, работающие с типом MySuperPuperClass. Данные будут храниться всё в том же Vector'е, но этот Vector будет не родителем нашего класса, а его полем/аттрибутом/property (все называют по-своему).
Таким образом, всю основную работу выполняет Vector, а наш класс просто перенаправляет все запросы к нему, попутно преобразуя типы и скрывая "лишние" методы Vector'а.
Ну, собственно, и получаем Vector в оболочке.
 
Y

Yason

Гость
#4
В таком случае, на пальцах объяснение звучит так.
В Java всё - объект. Ну, почти всё... Кроме примитивных типов данных (byte, int, boolean, и т.п.)
А это нехорошо, потому что нарушает красивую структуру языка и уже не всё можно прередать как "потомок java.lang.Object'а"

Поэтому и придумали эти самые оболочки. Они полезны при передаче данных между методами, и при различных преобразованиях (например, из строки и в строку).
Но выбросить примитивные типы за ненужностью тоже нельзя - вычисления с использованием одних только классов были бы довольно неэффективными.

Add-on: представьте, что нужно сохранить набор целых чисел в java.util.Vector. Он работает только с Object'ами, поэтому передать ему int нельзя. Но можено передать Integer.