вторник, 18 сентября 2007 г.

Фантазии из песка

Наткнулся на забавный сайт. Там можно скачать несколько интересных видеосъемок, как Ilana Yahav рисует песком раличные картины. Особенно радует динамика - то что постепенно картины меняются...

Nissan Quest

Недалеко от Казанского собора видел новенький Nissan Quest. Очень длинный минивэн. Я бы даже сказал макровэн - машинка явно не для крупных городов...

Бабье лето

Погода нынче отличная. Сегодня ездил в Городской Ипотечный банк за справкой. Это на набереной Мойки рядом с Исакиевским. Оттуда по каналам и мостам шел пешком на работу: Мойка, Грибанал и Фонтанка. Порадовало, что многие старые дома ремонтируют. Минус такой прогулки один: местные собачники заминировали все набережные...

Java Puzzle 46: The Case of the Confusing Constructor

Что делает следующая программа?
public class Confusing {
    private Confusing(Object object) {
        System.out.println("Object!");
    }
    private Confusing(double[] array) {
        System.out.println("Array!");
    }
    public static void main(String[] args) {
        new Confusing(null);
    }
}
Это вопрос по спецификации. Первый из раздела "классические головоломки". Программа скомпилируется и выполнится конструктор, напечатающий Array. В приведенном выше примере оба конструктора можно вызвать, но по спецификации выбирается тот, который более конкретный. Это второй конструктор, так как каждый массив - это объект, но не каждый объект - массив. Для принудительного вызова необходимого конструктора нужно привести аргументы к типу, определенному в списке формальных параметров:
    public static void main(String[] args) {
        new Confusing((Object) null);
    }
Обратите внимание, что если поменять тип первого конструктора в примере на Double (например), то программа не скомпилируется. В идеале, лучше избегать перегрузки конструкторов и методов.

Java Puzzle 45: Exhausting Workout

Проверяются знания рекурсии. Что делает следующая программа?
public class Workout {
    public static void main(String[] args) {
        workHard();
        System.out.println("It's nap time.");
    }
    private static void workHard() {
        try {
            workHard();
        } finally {
            workHard();
        }
    }
}
Забавно, но если метод будет вызывать сам себя, то вы достаточно быстро получите StackOverflowError. Но если использовать блоки try-finally, как в примере, то на ожидание StackOverflowError уйдет 10291 лет. Можно сказать