{java puzzlers} Josh Bloch: Java Puzzlers Epizode VI





Josh Bloch, William Pugh, Java Puzzlers Epizode VI, Google TechTalks [video @ video.google.com]

1. "Joy of Sets"
Что выведет программа?

public class ShortSet {
	public static void main(String[] args) {
		Set s = new HashSet();
		for (short i=0; i < 100; i++) {
			s.add(i);
			s.remove(i - 1);
		}
		System.out.println( s.size() );
	}
}


Ответ: «100»
Объяснение:
Выражение i-1 автоматически становится int.
Так как у нас сигнатура remove такая:

interface Set  extends Collection {
	public abstract void add(E e);
	public abstract remove(Object o);
}

То и при boxing будет создаваться Integer со значением i-1.
Соответственно, не будет объекта в Set, и в конце все Short сохранятся.

Мораль:
1. Collection.remove, Collection.contains, Map.get берут Object, а не E
2. Результат целочисленной арифметике всегда int или long
3. Нет смешиванию типов!
4. Не используйте short, предпочитайте int или long

2 "More Joy of Sets"
Что выведет программа?

import java.net.*;
public class UrlSet {
	private static final String[] URL_NAMES = {
		"http://javapuzzlers.com",
		"http://apache2-snort.skybar.dreamhost.com",
		"http://google.com",
		"http://findbug.sourceforge.com",
		"http://javapuzzlers.com",
	};
	public static void main(String[] args) throws MalformedURLException {
		Set favorites = new HashSet();
		for (String urlName : URL_NAMES)
			favorites.add( new URL(urlName) );
		System.out.println( favorites.size() );
	}
}

Ответ: «3» или вообще что-то другое.
Объяснение:
Первая, вторая и последняя строчка выдают в итоге один и тот же IP адрес, поэтому URL объект будут идентичны.

По документации:
1. Два URL объекта идентичны, если они имеют один и тот же протокол, указывают на идентичные хосты, имеют один и тот же номер порта, один тот же файл и фрагмент файла (видимо речь про ссылку в документе, test.html#blah-blah).
2. Два хоста идентичны, если оба host name указывают на один и тот же ip-адрес. Если ip адрес по host name не может быть определен, то идентичны, если имена эквиваленты без учета регистра.

Если мы находимся не в сети, то результат будет 4.

Мораль:
1. Не использовать URL как элемент Set или как ключ для Map, так как equals() и hashCode() не хорошо определены, они не подчиняются требованиям к этим методам.
2. Использовать вместо этого URI, а если надо делать из него URL.
3. equals() не должен зависеть от окружения!

3 "Race Little Number"
Как часто этот тест будет проходить?

public class Test extends junit.framework.TestCase {
	int number;
	public void test() throws InterruptedException {
		number = 0;
		Thread t = new Thread( new Runnable() {
			public void run() {
				assertEquals(2, number);
			}
		});
		number = 1;
		t.start();
		number++;
		t.join();
	}
}

Ответ: Всегда будет проходить успешно.
Объяснение:
Exception будет происходить в другом потоке, и JUnit его не увидит.

Мораль:
1. JUnit не поддерживает параллельность
2. Нужно предоставлять свою (использовать volatile переменную, которая определяет, все ли хорошо, и переопределить tearDown(), чтоб он проверял его состояние.

4. "Elvis Lives Again"
Что выведет эта программа?

public class Elvis {
	public static final Elvis ELVIS = new Elvis();
	private Elvis() {}
	private static final Boolean LIVING = true;
	private final Boolean alive = LIVING;

	public final Boolean lives() { return alive; }

	public static void main(String[] args) {
		System.out.println( ELVIS.lives() ? "Hound Dog" : "Heartbreak Hotel");
	}
}

Ответ: NullPointerException
Объяснение:
Инициализируем класс Elvis, все переменные значениями по умолчанию — а для объектов это null.

Далее пошли инициализаторы: создаем константу ELVIS — создаем объект этого уровня, создали поля, начинаем их инициализировать.
В переменную alive попадает значение LIVING, которое сейчас null!

Второй заход: ELVIS.lives() возвращает null, при попытке auto-unboxing произойдет NPE.

Мораль:
1. Предпочитайте примитивные типы их оберткам-классам (Integer и т.д.)
2. auto-unboxing может произойти, когда вы этого не ожидаете (и вызвать NPE)
3. никогда не используйте Boolean, как трехзначный тип — почти гарантированный NPE
4. прорабатывайте схему инициализации в классе: инициализаторы переменных объекта в конце инициализации класса.








































Вам это будет интересно!

  • {java puzzlers} Joshua Bloch: Tiger Trap [part II]
  • {java puzzlers} Joshua Bloch: Tiger Trap
  • {java puzzler} инициализация классов и конструирование объектов
  • Post form from java use Socets
  • {java} Java Language Specification
  • Последние новости

    Слово

    Назови человека свиньей, и он захрюкает. Пословица Проживая данную нам жизнь, мы все время находимся в гуще энергий, как положительных, так и отрицательных. По этическим нормам слово обладает определенной силой, следовательно, когда мы клевещем на человека, судим, обзываем, мы «де...
    Читать далее »

    ЭГРЕГОР

    Энергия эгрегора – квантовая структура, которая сформирована мыслями, знаниями и чувствами всего человечества – бывшего, настоящего и будущего. Эгрегор – это квантово лептонная скоррелированная структура, рожденная похожими мы...
    Читать далее »

    Как открыть свои чакры

    Открытие чакр увеличивает поток энергии в теле и вокруг него и, следовательно, улучшает наше физическое, ментальное и эмоциональное здоровье. Представьте себе каждую чакру по очереди. Они вращаются и становятся больше в размере. Начинайте с 1 – й чакры (пусть они вращаются в любую сторону, обычно они вращаются в разные). В то же ...
    Читать далее »

    Смерть или новая жизнь

    Из разговора двух зародышей в утробе матери: – Как ты думаешь, есть ли жизнь после родов? – Не знаю, оттуда еще никто не возвращался… Сравнительно недавно появились сенсационные сообщения доктора Раймонда А. Моуди о том, что ученые зарегистрировали фа...
    Читать далее »

    Чакры

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

    Три колонны космоса

    Показания: нарушение обменных процессов, снижение иммунитета, обновление сил. Методика исполнения. Средний и сердечный пальцы правой руки кладут на аналогичные пальцы левой руки. Мизинец левой руки кладут возле основания тыльной поверхности среднего и безымянного пальцев правой руки, затем все фиксируется мизинцем правой руки. Кон...
    Читать далее »

    Заключение

    Лучше зажечь свечу, чем проклинать сгущающуюся тьму. Дзенское изречение Вот и написана книга. Мне хочется верить, что вам она обязательно поможет в познании себя, утверждении своего «Я», определении своего места во Вселенной. На ум приходит китайская пословица: «Если не менять направление, мы наверняка достигнем того, к чему идем». А мы идем к Свету, Добру и Счастью. Мы ...
    Читать далее »