{java puzzlers} Joshua Bloch: Tiger Trap





"The Continuing Adventures of Java Puzzlers: Tiger Trap", Joshua Bloch, Neal Gafter, JavaOne Conference [pdf]

1. "Odd Behavior"

public class OddBehavior {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(-2, -1, 0, 1, 2);
		boolean foundOdd = false;
		for (Iterator<Integer> it = list.iterator(); it.hasNext(); )
			foundOdd = foundOdd || isOdd(it.next());
		System.out.println(foundOdd);
	}
	private static boolean isOdd(int i) {
		return (i&1) != 0;
	}
}

Ответ: Будет бесконечный цикл.

Объяснение:
Условный (conditional) оператор OR ( т.е., || ) — «ленивый»: выполняет правый операнд, только если это необходимо для определения результата (т.е. если первый операнд — false).

Мораль:
Используйте for-each вариант, где возможно — это красивей и безопаснее, чем явный итератор или использование индекса.
Если нужно вычислять все операнды — используйте логические (logical) операторы (& и |) .

2. "Set List"

public class SetList {
	public static void main(String[] args) {
		Set<Integer> set = new LinkedHashSet<Integer>();
		List<Integer> list = new ArrayList<Integer>();

		for (int i = -3; i < 3; i++) {
			set.add(i);
			list.add(i);
		}
		for (int i = -3; i < 3; i++) {
			set.remove(i);
			list.remove(i);
		}
		System.out.println(set + " " + list);
	}
}

Ответ: «[-3, -2, -1] [-2, 0, 2]»

Объяснение:
У List в данном случае будет вызываться remove(int), а не remove(Object).

Мораль:
Избегайте двусмысленной перегрузки!
Тяжело избежать таких казусов в Java 5 [generics, varargs, autoboxing]
Создавайте новое API с учетом такого поведения, старых правил уже недостаточно.
Опасайтесь List<Integer>

3. "Powers of Ten"

public enum PowerOfTen {
	ONE(1), TEN(10), HUNDRED(100) {
		@Override
		public String toString() {
			return Integer.toString(val);
		}
	};
	private final int val;
	PowerOfTen(int val) {this.val = val; }
	@Override
	public String toString(){
		return name().toLowerCase();
	}

	public static void main(String[] args) {
		System.out.println(ONE + " " + TEN + " " + HUNDRED);
	}
}

Ответ: Не скомпилируется.
«Non-static variable can’t be referenced from static context»

Объяснение:
Private поля не наследуются.
При этом в указанном статическом анонимном классе можно использовать super.val.

Мораль:
«Соседи» (nest-mates) могут использовать private поля других «соседей».
Но private поля никогда не наследуются.
"Расширение класса" для элемента enum определяет статический анонимный класс.
Сообщения компилятора иногда могут вводить в заблуждение.

4. "Testy Behavior"

import java.lang.reflect.*;
@interface Test {}
public class Testy {
	@Test public static void test() {return; }
	@Test public static void test2() { new RuntimeException; }
	public static void main(String[] args) throws Exception {
		for (Method m : Testy.class.getDeclaredMethods()) {
			if (m.isAnnotationPresent(Test.class)) {
				try {
					m.invoke(null);
					System.out.println("Pass ");
				} catch (Throwable ex) {
					System.out.println("Fail ");
				}
			}
		}
	}
}

Ответ: Ничего не напечатает.

Объяснение:
Исключение не генерируется (нет throw)
По умолчанию аннотации в runtime не учитываются.

Мораль:
Если нужны аннотации в runtime, используйте

import java.lang.annotation.*;
	@Retention(RetentionPolicy.RUNTIME)...

А если нужно изъять их из class file: @Retention(RetentionPolicy.SOURCE)
Нет гарантий о порядке рефлективных записей.




























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

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

    Слово

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

    ЭГРЕГОР

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

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

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

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

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

    Чакры

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

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

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

    Заключение

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