В этой задаче (продолжение предыдущей) авторы добавили метод hashCode(), однако поменяли тип параметра метода equals() с Object на имя класса, используемого в качестве элемента множества HashSet. Естественно, что никакого переопределения не происходит, а происходит перегрузка методов.
В языке Java перегрузка разрешена, но приводит к ошибкам и неразберихе. Читаем секцию 26 все той же необходимой к прочтению книги Effective Java. Начиная с версии Java 5 появилась аннотация @Override, которую авторы рекомендуют использовать. Я, например, включил в IDEA опцию, которая автоматически добавляет эту аннотацию при переопределении метода. Если в супер классе метод поменяет сигнатуру (всякое бывает), то не возникнет скрытого бага - проект просто не скомпилируется и вы найдете проблему за 5 секунд.
понедельник, 12 ноября 2007 г.
Java Puzzle 57: What's in a Name?
Задачка довольна простая. Некий объект используется как элемент множества HashSet. Метод equals() переопределен, а про метод hashCode() забыли.
В общем, автор напоминает 8 секцию его предыдущей книги Effective Java. Я уверен, что эта книга должна быть прочитана каждым Java-программистом, поэтому останавливаться здесь не будем. Скажем просто: переопределяйте метод hashCode() всегда, когда переопределяете метод equals().
В общем, автор напоминает 8 секцию его предыдущей книги Effective Java. Я уверен, что эта книга должна быть прочитана каждым Java-программистом, поэтому останавливаться здесь не будем. Скажем просто: переопределяйте метод hashCode() всегда, когда переопределяете метод equals().
Solid State Disk
Такое чувство, что в моем ноуте начинает сыпаться винт. Очень неприятно. Поэтому стал смотреть, на что бы такое его можно заменить...
Оказывается, уже вышел Solid State Disk от Samsung. Правда - дорого пока. Зато, блин, не посыпется, если в дороге стукнешь. А Toshiba начала выпускать ноуты с такими дисками. Но из-за SSD диска цена тоже зашкаливает все разумные пределы.
Оказывается, уже вышел Solid State Disk от Samsung. Правда - дорого пока. Зато, блин, не посыпется, если в дороге стукнешь. А Toshiba начала выпускать ноуты с такими дисками. Но из-за SSD диска цена тоже зашкаливает все разумные пределы.
Myon
Поскреб по сусекам и нашел альбом Ghost In Paradise (2002). Очень добротно сделанный альбом. Как говорится, очередная пятерка очередных финнов...
Достаточно динамичный power metal с кучей мелодичных вставок, которые делают музыку очень приятной слуху. Альбом на твердую четверку, так как не смотря на качество записи и профессионализм музыкантов альбом не цепляет. Да, есть некоторые интересные композиции, но, в основном, под настроение...
четверг, 8 ноября 2007 г.
Метровый негатив
Сегодня что-то дикое в метро творилось. Меня достали настолько, что на ПлАНе я не выдержал. Спускаюсь с эскалатора, а там поезд приехал. Все с этого поезда по всей платформе общей массой рвутся на эскалатор. Те кто спускается с эскалатора в ужасе стоят всех пропускают или прячутся за колонны. Ну я сказал себе, что у нас правостороннее движение и пошел по самой правой стороне. Несколько человек пытались меня сбить, но неуспешно. Масса мне позволяет. Двое особо шустрых очень сильно отлетели обратно в толпу, возмущаясь. Чем - непонятно.
Есть предположение, что автомобилисты-уроды, которые помялись на свежем голольду, спустились в метро и ведут себя как на дороге. Только если на дороге нормальные люди их пропускают, боясь повредить машину, то в метро все совсем по-другому. Хотя может быть это из-за того, что Обводный закрыт и, как пишет Стас, нигде не проехать...
Когда в вагон заходил поразился. Стоит тетка с парнем и огромным чемоданом. Стоит прямо напротив двери. Народ протискивается мимо ругается. Ей сын, видимо, сказал, что подвинуться надо бы. На что тетка громко ответила: "Что я с чемоданом по вагону ходить должна? Пусть остальные обходят!"
Бля!
Есть предположение, что автомобилисты-уроды, которые помялись на свежем голольду, спустились в метро и ведут себя как на дороге. Только если на дороге нормальные люди их пропускают, боясь повредить машину, то в метро все совсем по-другому. Хотя может быть это из-за того, что Обводный закрыт и, как пишет Стас, нигде не проехать...
Когда в вагон заходил поразился. Стоит тетка с парнем и огромным чемоданом. Стоит прямо напротив двери. Народ протискивается мимо ругается. Ей сын, видимо, сказал, что подвинуться надо бы. На что тетка громко ответила: "Что я с чемоданом по вагону ходить должна? Пусть остальные обходят!"
Бля!
среда, 7 ноября 2007 г.
Железная дорога
Java Puzzle 56: Big Problem
Проверим знание класса BigInteger. Что напечатает следующая программа?
BigInteger value = new BigInteger("1000000");
value.add(new BigInteger("1000000"));
System.out.println(value);
А вот и нет! Не 2 миллиона, а всего 1. Авторы данного API использовали не вполне корректные имена для методов неизменяемого (immutable) объекта, что и вводит пользователей в заблуждение. Чтобы исправить ошибку надо сделать так:
BigInteger value = new BigInteger("1000000");
value = value.add(new BigInteger("1000000"));
System.out.println(value);
BigInteger value = new BigInteger("1000000");
value.add(new BigInteger("1000000"));
System.out.println(value);
А вот и нет! Не 2 миллиона, а всего 1. Авторы данного API использовали не вполне корректные имена для методов неизменяемого (immutable) объекта, что и вводит пользователей в заблуждение. Чтобы исправить ошибку надо сделать так:
BigInteger value = new BigInteger("1000000");
value = value.add(new BigInteger("1000000"));
System.out.println(value);
Java Puzzle 55: Creationism
Иногда полезно для класса знать количество экземпляров, которые были созданы. Следующая программа демонстрирует эту технику. Что будет напечатано?
public class Creator {
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
Creature creature = new Creature();
System.out.println(Creature.getCount());
}
}
class Creature {
private static long count = 0;
public static long getCount(String[] args) {
return count;
}
public Creature() {
count++;
}
}
Программа не скомпилируется, так как декларация локальной переменной допустима только внутри блока (JLS 14.12-14). Декларацию можно убрать, используя только создание объекта, так как локальная переменная все равно не используется.
Кроме того, авторы не рекомендуют использовать int как тип счетчика, чтобы избежать переполнения. Максимум для типа int - 231 - 1 (около 2.1 * 109), а для типа long - 263 - 1 (около 9.2 * 1018). Сейчас компьютеры способны создавать около 108 объектов в секунду. Следовательно переполнение для типа long произойдет через три тысячи лет.
Также авторы рекомендуют использовать thread-safe вариант:
class Creature {
private static long count = 0;
public static long getCount(String[] args) {
synchronized (Creature.class) {
return count;
}
}
public Creature() {
synchronized (Creature.class) {
count++;
}
}
}
В Java 5 и выше можно использовать класс AtomicLong:
import java.util.concurrent.atomic.AtomicLong;
class Creature {
private static final AtomicLong count = new AtomicLong();
public static long getCount(String[] args) {
return count.get();
}
public Creature() {
count.incrementAndGet();
}
}
public class Creator {
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
Creature creature = new Creature();
System.out.println(Creature.getCount());
}
}
class Creature {
private static long count = 0;
public static long getCount(String[] args) {
return count;
}
public Creature() {
count++;
}
}
Программа не скомпилируется, так как декларация локальной переменной допустима только внутри блока (JLS 14.12-14). Декларацию можно убрать, используя только создание объекта, так как локальная переменная все равно не используется.
Кроме того, авторы не рекомендуют использовать int как тип счетчика, чтобы избежать переполнения. Максимум для типа int - 231 - 1 (около 2.1 * 109), а для типа long - 263 - 1 (около 9.2 * 1018). Сейчас компьютеры способны создавать около 108 объектов в секунду. Следовательно переполнение для типа long произойдет через три тысячи лет.
Также авторы рекомендуют использовать thread-safe вариант:
class Creature {
private static long count = 0;
public static long getCount(String[] args) {
synchronized (Creature.class) {
return count;
}
}
public Creature() {
synchronized (Creature.class) {
count++;
}
}
}
В Java 5 и выше можно использовать класс AtomicLong:
import java.util.concurrent.atomic.AtomicLong;
class Creature {
private static final AtomicLong count = new AtomicLong();
public static long getCount(String[] args) {
return count.get();
}
public Creature() {
count.incrementAndGet();
}
}
вторник, 6 ноября 2007 г.
Стая
Купил в Кайласе диск Страна Льдов (2005). Сначала заинтересовало оформление альбома - очень качественное, как на западных лейблах. Прикинул музыку - вполне добротный тяжелый рок с большим количеством баллад, причем очень качественно сведен. Голос вокалиста очень напоминает Кипелова в его лучшие годы. Лирика русскоязычная, незапоминающаяся, но ведь не это главное...
Главное, что слушать интересно!
Пошукал в интернет и нашел сайт белорусской группы Стая. Во братья славяне дают!
ЗЫ. Кипелов ТАК уже не поет, а Беркут, видимо, и не будет. Да и Ария уже не та...
воскресенье, 4 ноября 2007 г.
Обновление шкафов
Наконец-то нам привезли шкафы и полки, что мы заказали. Поставили пока шкаф для обуви в коридоре, и шкафы для CD и DVD в зале. Очень симпатично выглядит!
Расставлял свои диски - теперь их удобно брать и таскать на работу. Думаю различные обзоры станут чаще появляться, если мне не надоест ;)
DVD влезли вплотную. Как дальше быть - не знаю. Может купить тонкие коробочки, чтобы больше влезло?
Расставлял свои диски - теперь их удобно брать и таскать на работу. Думаю различные обзоры станут чаще появляться, если мне не надоест ;)
DVD влезли вплотную. Как дальше быть - не знаю. Может купить тонкие коробочки, чтобы больше влезло?
суббота, 3 ноября 2007 г.
КАД - ИКЕА
Сегодня ездили в Мега-ИКЕА. Пройтись по магазинам да на детской площадке поиграться.
Обнаружили, что открылся второй вантовый мост. Теперь выезд на мост гораздо проще, так как там 4 полосы и никто по крайней не едет. Едем в общем потоке... Смотрю на спидометр - там уже 150. Смотрю за окно - пора с моста съезжать. Клево!
В обратную сторону на мосту пока две полосы. Все еще спиливают старое ограждение...
Быстрее бы КАД до Пашки проложили. Так не хочется по Ленинскому ездить.
Пока мы с Мишкой на деской площадке тусовались Юля гуляла по ИКЕА. Накупила всякого...
Пытался понять по чеку, что конкретно мы купили и почем - так и не понял:
БУРКЕН КН+КР 15
ИСИГ САЛФ БУМ 3 (салфетки)
ФЁРВОНА ТНСН РК
СМИККА СУХ БУКЕ (букет сухих цветов)
МЮКЕН ЗЕРК НАСТ (зеркало настольное)
БУРКЕН ДЗТР СХР (дозатор сахара)
КОМПЛИМЕНТ НАБ
БАРНСЛИГ МИНИ-К
БУХОЛЬМЕН ДСК Р (доска разделочная)
КЛАППАР ИГЕЛЬКО
ЭПИСК МСК 14 КР
ИСИГ ГИРЛ 5 М Ж
ИСИГ ГИРЛ 5 М М
НЬЮТА МОЧ Д/ТЕЛ
ФЁРВОНА ТЕНН МЯ
БЕВАРА ЗЖМ Д/ПК (зажимы для пакетов)
ПАТРУЛЬ ОТРАЖАТ (отражатель на одежду)
ШАРМ ТРК КРСН/Ч
Ну что такое Клаппар Игелько?
Шведы, блин....
Обнаружили, что открылся второй вантовый мост. Теперь выезд на мост гораздо проще, так как там 4 полосы и никто по крайней не едет. Едем в общем потоке... Смотрю на спидометр - там уже 150. Смотрю за окно - пора с моста съезжать. Клево!
В обратную сторону на мосту пока две полосы. Все еще спиливают старое ограждение...
Быстрее бы КАД до Пашки проложили. Так не хочется по Ленинскому ездить.
Пока мы с Мишкой на деской площадке тусовались Юля гуляла по ИКЕА. Накупила всякого...
Пытался понять по чеку, что конкретно мы купили и почем - так и не понял:
БУРКЕН КН+КР 15
ИСИГ САЛФ БУМ 3 (салфетки)
ФЁРВОНА ТНСН РК
СМИККА СУХ БУКЕ (букет сухих цветов)
МЮКЕН ЗЕРК НАСТ (зеркало настольное)
БУРКЕН ДЗТР СХР (дозатор сахара)
КОМПЛИМЕНТ НАБ
БАРНСЛИГ МИНИ-К
БУХОЛЬМЕН ДСК Р (доска разделочная)
КЛАППАР ИГЕЛЬКО
ЭПИСК МСК 14 КР
ИСИГ ГИРЛ 5 М Ж
ИСИГ ГИРЛ 5 М М
НЬЮТА МОЧ Д/ТЕЛ
ФЁРВОНА ТЕНН МЯ
БЕВАРА ЗЖМ Д/ПК (зажимы для пакетов)
ПАТРУЛЬ ОТРАЖАТ (отражатель на одежду)
ШАРМ ТРК КРСН/Ч
Ну что такое Клаппар Игелько?
Шведы, блин....
пятница, 2 ноября 2007 г.
Quazatron
Была на ZX Spectrum одна занятная игрушка. Там нужно было ездить на роботе по трёхмерным уровням, постреливать по другим роботам или брать их на абордаж, во время которого нужно было успеть справиться с некоей вариацией лазерной головоломки за ограниченное время.
И вообще, на этом сайте есть все спектрумовские программы, о которых я вообще что-то слышал. Надо бы попробовать установить эмулятор на Pocket PC. Вот только не знаю, как можно играть стилусом вместо джойстика и клавиатуры...
И вообще, на этом сайте есть все спектрумовские программы, о которых я вообще что-то слышал. Надо бы попробовать установить эмулятор на Pocket PC. Вот только не знаю, как можно играть стилусом вместо джойстика и клавиатуры...
Новый загранпаспорт
Тут коллега пишет, как надо получать загранпаспорт с минимумом геморроя. Полезная информация. Через пару лет поеду в центральный ОВИР, так как с районными отделениями у меня всегда куча проблем. А в центральном (давным-давно) делал и себе, и бабушке (жительница Эстонии, но гражданка России) без проблем.
Sonata Arctica
Переслушал альбом Reckoning Night (2004). Очень добротный альбом в отличии от следующего...
Первые же аккорды дают понять, что группа не растеряла своей энергетики - настолько "по-сонатовски" быстро открывается этот альбом. Дальше - больше. Композиции звучат мощно и сильно, с неким хэви-металлическим оттенком, но именно они придают этим песням особый шарм. Есть и красивые баллады для романтиков...
Некоторые отрезки звучат настолько необычно для группы, что ее и не узнать. Просто у Sonata Arctica появилось новое звучание. Развивается группа, вот только куда?
Java Puzzle 54: Null and Void
Что произойдет со следующей программой:
public class Null {
public static void main(String[] args) {
((Null) null).hello();
}
private static void hello() {
System.out.println("Hello world!");
}
}
Сначала можно подумать, что программа сгенерирует NullPointerException. На самом деле выражение используется для вычисления класса, который содержит статический метод, а значение выражения игнорируется.
Но я бы еще больше бы постарался запутать тестируемого:
public class Null {
public static void main(String[] args) {
call(null);
}
private static void call(Null object) {
object.hello();
}
private static void hello() {
System.out.println("Hello world!");
}
}
И совет на будущее. Не используйте ссылки на объекты для вызова статического метода - всегда указывайте имя класса, например:
Integer.toString(10)
public class Null {
public static void main(String[] args) {
((Null) null).hello();
}
private static void hello() {
System.out.println("Hello world!");
}
}
Сначала можно подумать, что программа сгенерирует NullPointerException. На самом деле выражение используется для вычисления класса, который содержит статический метод, а значение выражения игнорируется.
Но я бы еще больше бы постарался запутать тестируемого:
public class Null {
public static void main(String[] args) {
call(null);
}
private static void call(Null object) {
object.hello();
}
private static void hello() {
System.out.println("Hello world!");
}
}
И совет на будущее. Не используйте ссылки на объекты для вызова статического метода - всегда указывайте имя класса, например:
Integer.toString(10)
Java Puzzle 53: Do Your Thing
Допустим, что есть некоторый библиотечный класс, который нельзя изменить:
public class Thing {
public Thing(int i) {}
}
Допустим, вам надо отнаследоваться от этого класса следующим образом, чтобы иметь доступным значение, которое передается суперклассу при инициализации:
public class MyThing {
private final int i;
public Thing() {
super(this.i = Generator.getId());
}
}
Приведенный выше класс не скомпилируется, так как нельзя ссылаться на переменную класса до вызова метода super(). Как можно выкрутиться из этой ситуации, чтобы метод Generator.getId() не вызывался дважды?
Решение использует альтернативный вызов конструктора, описанный в JLS 8.8.7.1:
public class MyThing {
private final int i;
public Thing() {
this(Generator.getId());
}
private Thing(int i) {
super(i);
this.i = i;
}
}
public class Thing {
public Thing(int i) {}
}
Допустим, вам надо отнаследоваться от этого класса следующим образом, чтобы иметь доступным значение, которое передается суперклассу при инициализации:
public class MyThing {
private final int i;
public Thing() {
super(this.i = Generator.getId());
}
}
Приведенный выше класс не скомпилируется, так как нельзя ссылаться на переменную класса до вызова метода super(). Как можно выкрутиться из этой ситуации, чтобы метод Generator.getId() не вызывался дважды?
Решение использует альтернативный вызов конструктора, описанный в JLS 8.8.7.1:
public class MyThing {
private final int i;
public Thing() {
this(Generator.getId());
}
private Thing(int i) {
super(i);
this.i = i;
}
}
Подписаться на:
Сообщения (Atom)