{java puzzlers} Josh Bloch: Java Puzzlers Epizode VI
Josh Bloch, William Pugh, Java Puzzlers Epizode VI, Google TechTalks [ @ ]
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 сохранятся.
Мораль: Ответ: «3» или вообще что-то другое. По документации: Если мы находимся не в сети, то результат будет 4. Мораль: Ответ: Всегда будет проходить успешно. Мораль: Ответ: NullPointerException Далее пошли инициализаторы: создаем константу ELVIS — создаем объект этого уровня, создали поля, начинаем их инициализировать. Второй заход: ELVIS.lives() возвращает null, при попытке auto-unboxing произойдет NPE. Мораль:
1. Collection
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
Объяснение:
Первая, вторая и последняя строчка выдают в итоге один и тот же IP адрес, поэтому URL объект будут идентичны.
1. Два URL объекта идентичны, если они имеют один и тот же протокол, указывают на идентичные хосты, имеют один и тот же номер порта, один тот же файл и фрагмент файла (видимо речь про ссылку в документе, test.html#blah-blah).
2. Два хоста идентичны, если оба host name указывают на один и тот же ip-адрес. Если ip адрес по host name не может быть определен, то идентичны, если имена эквиваленты без учета регистра.
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");
}
}
Объяснение:
Инициализируем класс Elvis, все переменные значениями по умолчанию — а для объектов это null.
В переменную alive попадает значение LIVING, которое сейчас null!
1. Предпочитайте примитивные типы их оберткам-классам (Integer и т.д.)
2. auto-unboxing может произойти, когда вы этого не ожидаете (и вызвать NPE)
3. никогда не используйте Boolean, как трехзначный тип — почти гарантированный NPE
4. прорабатывайте схему инициализации в классе: инициализаторы переменных объекта в конце инициализации класса.
Вам это будет интересно!
Последние новости
Слово
Назови человека свиньей, и он захрюкает. Пословица Проживая данную нам жизнь, мы все время находимся в гуще энергий, как положительных, так и отрицательных. По этическим нормам слово обладает определенной силой, следовательно, когда мы клевещем на человека, судим, обзываем, мы «де...Читать далее »
ЭГРЕГОР
Энергия эгрегора – квантовая структура, которая сформирована мыслями, знаниями и чувствами всего человечества – бывшего, настоящего и будущего. Эгрегор – это квантово лептонная скоррелированная структура, рожденная похожими мы...Читать далее »
Как открыть свои чакры
Открытие чакр увеличивает поток энергии в теле и вокруг него и, следовательно, улучшает наше физическое, ментальное и эмоциональное здоровье. Представьте себе каждую чакру по очереди. Они вращаются и становятся больше в размере. Начинайте с 1 – й чакры (пусть они вращаются в любую сторону, обычно они вращаются в разные). В то же ...Читать далее »
Смерть или новая жизнь
Из разговора двух зародышей в утробе матери: – Как ты думаешь, есть ли жизнь после родов? – Не знаю, оттуда еще никто не возвращался… Сравнительно недавно появились сенсационные сообщения доктора Раймонда А. Моуди о том, что ученые зарегистрировали фа...Читать далее »
Чакры
Чакры являются основными энергетическими органами биополя. Они контролируют нашу деятельность во внешнем мире, а каждая из чакр несет ответственность за определенную сферу деятельности. Основное предназначение их заключается в том, что они несут ответственность за поддержание энергообмена живого организма с окружающей средой через специальные каналы связи. Таким образом, при нарушении процесса энергообмена у нас возникают болезни и проблемы...Читать далее »
Три колонны космоса
Показания: нарушение обменных процессов, снижение иммунитета, обновление сил. Методика исполнения. Средний и сердечный пальцы правой руки кладут на аналогичные пальцы левой руки. Мизинец левой руки кладут возле основания тыльной поверхности среднего и безымянного пальцев правой руки, затем все фиксируется мизинцем правой руки. Кон...Читать далее »
Заключение
Лучше зажечь свечу, чем проклинать сгущающуюся тьму. Дзенское изречение Вот и написана книга. Мне хочется верить, что вам она обязательно поможет в познании себя, утверждении своего «Я», определении своего места во Вселенной. На ум приходит китайская пословица: «Если не менять направление, мы наверняка достигнем того, к чему идем». А мы идем к Свету, Добру и Счастью. Мы ...Читать далее »
