пятница, 23 мая 2008 г.

Бой без правил

Бравый экшн про похождения во Вьетнаме. Спасаемые очкарики бывают полезны: дают новое оружие или помогют переправиться через реку:

Это классический шутер, в котором герой неимоверно крут и легко справляется с толпами врагов:

Если прямо не попасть, то можно закинуть гранату. И не смотрите, что на скриншоте глюк. Это винды снимают не в конце генерации кадра:

Коллега на работе прошёл её и ему показало картинки, созданные на этапе разработки игры:

Мне лично не справиться с управлением, дае если его поменять. Но игрушка сделана с душой. Очень прикольно!

Java Puzzle 92: Twisted Pair

Следующая программа выполняет неестественное действие с анонимным классом. Что она напечатает?
public class Twisted {
private final String name;
public Twisted(String name) {
this.name = name;
}
private String getName() {
return this.name;
}
private void reproduce() {
new Twisted("reproduce") {
private void print() {
System.out.println(getName());
}
}.print();
}
public static void main(String[] args) {
new Twisted("main").reproduce();
}
}

Сначала я подумал, что она совсем не скомпилируется. Потом подумал, что по логике должно напечатать "reproduce". Но и тут чувствуется подвох...
Так было бы, если бы getter не был бы private. Согласно спецификации (JLS 8.2) приватные члены класса никогда не наследуются. Следовательно, из метода print будет вызван метод внешнего (outer) класса, т.е. того класса, экземпляр которого мы создали с именем "main". Соответственно, будет напечатано "main".
Авторы напоминают совет из головоломки 6: если вы не можете с первого взгляда сказать, что делает некая программа, то возможно она делает совсем не то, что вы от нее хотите.

Java Puzzle 91: Serial Killer

А вот объясните-ка, почему сериализация не работает в следующей программе?
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class SerialKiller {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Sub sub = new Sub(666);
sub.check();

ByteArrayOutputStream bos = new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(sub);

ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
Sub copy = (Sub) new ObjectInputStream(bis).readObject();
copy.check();
}
}
class Super implements Serializable {
final Set set = new HashSet();
}
class Sub extends Super {
private int id;
Sub(int id) {
this.id = id;
set.add(this);
}
void check() {
if (!set.contains(this))
throw new Error("invariant");
}
public int hashCode() {
return id;
}
public boolean equals(Object object) {
if (object instanceof Sub) {
Sub that = (Sub) object;
return that.id == this.id;
}
return false;
}
}

Вкратце: если необходимо сериализовать HashSet, HashMap или Hashtable, то надо убедиться в том, что их содержимое (элементы, ключи или значения) не содержат прямых или косвенных ссылок на эти коллекции.
И ещё: если вы разрабатываете сериализуемые классы, то в методах readObject или readResolve избегайте прямого или косвенного вызова методов объектов, которые десериализованы.

Beatallica


В прошлом году скачал MP3 этой группы. Много смеялся. Жуткая смесь музыки и текстов The Beatles и Metallica. Кстати, псевдонимы у музыкантов - такая же смесь: Jaymz Lennfield, Grg Hammetson, Kliff McBurtney и Ringo Larz.
Сегодня увидел в Кайласе - не мог не купить. Это их первый альбом: Sgt. Hetfield's Motorbreath Pub Band (2007). Говорят, в этом году вышел ещё один их альбом: All You Need Is Blood (2008). В нём у них всего одна песня, но исполняется на разных языках, включая русский.
Если нравятся мэтры, а тексты и музыка давно в крови, то рекомендую заслушать этот альбом. Стёбно!