NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Аналогия ? Я дам ему сильный удар... Ваш стерео Проигрывателя компакт-дисков бесполезен без CD с музыкой на нем... (Это зависит от CD). Если бы они создали Проигрыватели компакт-дисков с CD уже в нем, это стало бы скучным очень быстро...
, Таким образом, они создают их так, можно "ввести" CD, (от которого он зависит) в плеер. Тем путем можно ввести различный каждый раз и получить "различное" поведение (музыка), зависящая, на котором Вы вводите.
единственное требование - то, что CD должен быть совместим с интерфейс определенный плеером. (Вы не можете проигрывать диск синего луча в проигрывателе компакт-дисков 1992.)
В их представлении JavaPolis 2003 года ( слайды ), Jon TirsГ©n & Aslak HellesГёy имел забавную аналогию с Girl
объект, которому нужно Boy
для целования. Я, кажется, помню, что эти BoyFactory
иногда известен как 'ночной клуб', но это не находится в слайдах.
Фокусник ловкость рук ! Тем, что можно думать, что Вы видите, можно тайно управлять или заменить.
Возможно, внимание на "инжекционную" часть? Когда я вижу, что термин, думаю о сиринксах. Процесс продвижения зависимостей компонента к компоненту может считаться вводящий в компонент.
Точно так же, как с телом, когда существует что-то, в чем оно нуждается в способе медицины (компонент, в котором оно нуждается) можно ввести его в тело.
Жизнь полна аналогий внедрения зависимости:
Думайте о нем как о реализации "Инверсии Управления" шаблон. Я предполагаю, Ваша проблема, Вы так привыкли к ней, Вы не понимаете, что это настолько просто.
Позволяют нам запуститься вначале.
В программах первых лет следовал за данным путем через код. Распоряжение вызванных функций было дано программистом.
В интерактивных программах, например, главным образом ЛЮБОЙ программе, Вы не можете сказать, в какую функцию заходят во сколько. Только посмотрите на GUI или веб-сайт. Вы не можете сказать, в какое время, какая кнопка или ссылка нажаты. Таким образом, "управление" того, что происходит, больше не в программе, это во внешнем источнике. "Управление" было инвертировано. Функция больше не "действует", она вместо этого "слушает". Думайте о голливудском принципе: "Не звоните нам, мы звоним Вам". Слушатель является хорошим примером для реализации этого шаблона.
МОК понят функциями или "методами" в "объектно-ориентированном мире" сегодня.
"Внедрение зависимости" теперь означает то же, но не для "методов", которые делают что-то , а для "объектов", которые содержат данные .
данные больше не являются частью объекта, содержащего его. Это "введено" в объект во времени выполнения. Для пребывания в Голливуде думайте о кинозвезде, играя в гольф для разговора о бизнесе, но оставаться в форме, она голодает сама вниз, минимизируя ее вес мышц, и поэтому она только в состоянии нести один клуб за один раз.
Так, на поле для гольфа ее игра в большой степени зависела бы от одного клуба, она несет.
Lucky для нее, существуют кэдди, неся много клубов когда-то, и также имея знание что клуб использовать в какое время. Теперь она независима от своей ограниченной возможности нести гольф-клубы. "Не думайте о конкретном клубе для износа, мы знаем их всех и даем Вам правильного в нужное время".
кинозвезда является объектом, и гольф-клубы являются членами объекта. Это - внедрение зависимости.
Другая аналогия: давайте скажем, что Вы - разработчик и каждый раз, когда Вам нравитесь Вы книги по информатике порядка с рынка непосредственно - Вы знаете продавцов и их цены. На самом деле Ваша компания могла бы иметь предпочтительного продавца, и Вы связываетесь с ними непосредственно. Все это хорошо работает, но может быть новым продавцом, теперь предлагает лучшие цены, и Ваша компания хочет изменить 'предпочтительного' продавца.
В этой точке необходимо внести следующие изменения - обновляют контактную информацию (и другой материал), чтобы использовать нового продавца. Вы все еще размещаете заказ непосредственно.
Теперь полагают, что мы представляем новый промежуточный шаг, существует чиновник 'библиотеки' в компании, и необходимо пройти его для получения книг. В то время как существует новая зависимость, Вы теперь неуязвимы для любых изменений в продавце: или режим изменений продавца оплаты или сам продавец изменяются, Вы теперь просто помещаете порядок в библиотекаря, и он получает книги для Вас.
От Главные Первые Шаблоны разработки :
Помнят, код должен быть закрыт (для изменения) как цветок лотоса вечером, все же открыться (к расширению) как цветок лотоса утром
А, поддерживающий DI объект может быть настроен путем введения поведений, определенных в других классах. Структура исходного объекта не имеет изменения для создания многих изменений. Инжекция может быть сделана явной при наличии запроса класса другие классы рабочего в его конструкторе, или это может быть менее очевидно при использовании monkeypatching на динамических языках как Python.
Используя аналогию класса Человека, можно взять основную человеческую платформу, передать его ряд органов и часов, которые это развивает. Человек непосредственно не знает, как органы работают, но их поведения подтверждают к ожидаемому интерфейсу и влияют на физическое и умственное проявление владельца.
Лучшая аналогия, о которой я могу думать, является аналогией найма механика.
Без внедрение зависимости, Вы нанимаете механика, и механик приносит свои собственные инструменты. У него могут быть паршивые инструменты, у него могут быть большие инструменты, он может использовать трубный ключ, когда он должен использовать сокет. Вы не знаете и не можете заботиться, пока он сделал работу.
С внедрение зависимости, Вы нанимаете механика, и Вы предоставляете ему инструменты, с которыми Вы хотите, чтобы он сделал свою работу. Вы добираетесь для выбора то, что Вы считаете лучшими или самыми соответствующими инструментами для работы, которую Вы нанимаете его, чтобы сделать.
Ваш менеджер проектов просит, чтобы Вы записали приложение.
Вы могли просто записать некоторый код на основе своего карьерного опыта до сих пор, но это вряд ли будет тем, что хочет Ваш PM.
Лучше был бы то, если бы Ваша зависимость от PM ввела , Вы с говорите спецификацию для приложения. Теперь Ваш код будет связанным со спецификацией, которую он дает Вам.
Лучше, если Вам сказали, где исходный репозиторий был.
Лучше, если Вам сказали, какова техническая платформа была.
Лучше, если Вам сказали, когда это должно было быть сделано.
И т.д.