{java puzzlers} Joshua Bloch: Tiger Trap
"The Continuing Adventures of Java Puzzlers: Tiger Trap", Joshua Bloch, Neal Gafter, JavaOne Conference []
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)
Нет гарантий о порядке рефлективных записей.
Вам это будет интересно!
Последние новости
Слово
Назови человека свиньей, и он захрюкает. Пословица Проживая данную нам жизнь, мы все время находимся в гуще энергий, как положительных, так и отрицательных. По этическим нормам слово обладает определенной силой, следовательно, когда мы клевещем на человека, судим, обзываем, мы «де...Читать далее »
ЭГРЕГОР
Энергия эгрегора – квантовая структура, которая сформирована мыслями, знаниями и чувствами всего человечества – бывшего, настоящего и будущего. Эгрегор – это квантово лептонная скоррелированная структура, рожденная похожими мы...Читать далее »
Как открыть свои чакры
Открытие чакр увеличивает поток энергии в теле и вокруг него и, следовательно, улучшает наше физическое, ментальное и эмоциональное здоровье. Представьте себе каждую чакру по очереди. Они вращаются и становятся больше в размере. Начинайте с 1 – й чакры (пусть они вращаются в любую сторону, обычно они вращаются в разные). В то же ...Читать далее »
Смерть или новая жизнь
Из разговора двух зародышей в утробе матери: – Как ты думаешь, есть ли жизнь после родов? – Не знаю, оттуда еще никто не возвращался… Сравнительно недавно появились сенсационные сообщения доктора Раймонда А. Моуди о том, что ученые зарегистрировали фа...Читать далее »
Чакры
Чакры являются основными энергетическими органами биополя. Они контролируют нашу деятельность во внешнем мире, а каждая из чакр несет ответственность за определенную сферу деятельности. Основное предназначение их заключается в том, что они несут ответственность за поддержание энергообмена живого организма с окружающей средой через специальные каналы связи. Таким образом, при нарушении процесса энергообмена у нас возникают болезни и проблемы...Читать далее »
Три колонны космоса
Показания: нарушение обменных процессов, снижение иммунитета, обновление сил. Методика исполнения. Средний и сердечный пальцы правой руки кладут на аналогичные пальцы левой руки. Мизинец левой руки кладут возле основания тыльной поверхности среднего и безымянного пальцев правой руки, затем все фиксируется мизинцем правой руки. Кон...Читать далее »
Заключение
Лучше зажечь свечу, чем проклинать сгущающуюся тьму. Дзенское изречение Вот и написана книга. Мне хочется верить, что вам она обязательно поможет в познании себя, утверждении своего «Я», определении своего места во Вселенной. На ум приходит китайская пословица: «Если не менять направление, мы наверняка достигнем того, к чему идем». А мы идем к Свету, Добру и Счастью. Мы ...Читать далее »
