WeakReference и обработка событий

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

31
задан 3 revs, 3 users 75% 17 October 2012 в 21:44
поделиться

4 ответа

Хорошо привыкнуть отказываться от подписки от событий, когда Вы можете, но иногда нет очевидного метода "очистки", где это может быть сделано. Мы недавно отправили статья блога об этом предмете; это включает методы, которые помогают подписаться на событие с WeakReference.

14
ответ дан 27 November 2019 в 22:47
поделиться

Слабый шаблон делегата - что-то, что должно быть там в CLR. Нормальная выставка событий "уведомляет меня, в то время как Вы - живая" семантика, в то время как часто мы должны "уведомить меня, в то время как я жив". Просто наличие делегата на WeakReference является неправильным, потому что делегат является объектом также и даже когда получатель все еще жив, и имейте входящие ссылки, делегируйте себя, только ссылается упомянутым WeakReference и будет собран немедленно. См. это старое сообщение для примера реализации.

10
ответ дан 27 November 2019 в 22:47
поделиться

Слабые ссылки самостоятельно, не решайте проблему, поскольку делегат держит ссылку. В Библиотеке Составного приложения, которая поставлется с Призмой (www.microsoft.com/compositewpf), там класс WeakDelegate, который Вы могли вытянуть из источника. WeakDelegate в основном ues отражение и создает делегата только на мгновение вовремя и затем выпускает его, таким образом, никакое содержание любые указатели. В рамках CAL это используется классом EventAggregator, но Вы свободны сорвать его для своего собственного использования, поскольку это находится под МН MS

6
ответ дан 27 November 2019 в 22:47
поделиться

В то время как то, что Вы предлагаете, решает один набор проблем (ссылочное управление событием и предотвращение утечки памяти), это, вероятно, откроет новый набор проблем.

Одна проблема, которую я вижу, во время процесса обработки событий, если исходный объект будет собран "мусор" (поскольку это было только сохранено слабой ссылкой), любой код, которые получают доступ к исходному объекту, приведет к исключению нулевой ссылки. Можно утверждать, что обработчик событий не должен или получать доступ к исходному объекту, или он должен иметь сильную ссылку, но можно утверждать, что это могло быть худшей проблемой, чем та, которую Вы пытаетесь решить во-первых.

-3
ответ дан 27 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: