четверг, 13 марта 2008 г.

Тестируем замену Skype

Написал мне тут мой бывший коллега, который проработал в STAR семь с половиной лет. Попросил потестировать его текущий проект. Можно звонить по межгороду с компа практически на любой номер. Говорит, что Эстония тоже поддерживается...
Позвонив на домашний телефон я обнаружил, что качество связи хромает, чем немало удивил его. Завтра потестирую связь с Таллинном...
Если будете тестировать - пишите результат: откуда звонили, с какого провайдера, в какой город, на домашний или мобильный, ну и про качество связи не забывайте. Говорить можно, пока, минуту. Потом связь останется бесплатной, но за просмотр рекламного ролика...

Java Puzzle 76: Ping Pong

Следующая программа содержит синхронизированные статические методы. Что она напечатает? Гарантируется ли её результат от запуска к запуску?
public class PingPong {
public static synchronized void main(String[] args) {
Thread thread = new Thread() {
public void run() {
pong();
}
};
thread.run();
System.out.print("Ping");
}
static synchronized void pong() {
System.out.print("Pong");
}
}

Начнём с того, что синхронизировав статические методы мы добились того, что результат программы гарантируется от запуска к запуску. Но почему она пишет PongPing вместо PingPong?
Типичная ошибка и простая невнимательность. Для запуска отдельного потока надо вызывать метод start, а не метод run. В нашем случае всё действие происходит на одном потоке.
Будьте внимательны!

Java Puzzle 75: Heads or Tails?

Поведение приведённой ниже программы меняется при переходе на Java 5. Почему? Как будет себя вести программа на версиях 1.4 и 5?
import java.util.Random;
public class CoinSide {
private static Random rnd = new Random();
private static CoinSide flip() {
return rnd.nextBoolean()
? Heads.INSTANCE
: Tails.INSTANCE;
}
public static void main(String args) {
System.out.println(flip());
}
}
class Heads extends CoinSide {
private static Heads INSTANCE = new Heads();
public String toString() {
return "heads";
}
}
class Tails extends CoinSide {
private static Tails INSTANCE = new Tails();
public String toString() {
return "tails";
}
}

Начнём с версии 1.4 - программа не скомпилируется. Поведение условного оператора (?:) раньше было более ограничивающим. Он требовал, чтобы обе части были одинакового класса или один класс был бы подклассом другого. А в нашем примере это не так.
После версии 5 стало дозволено немного больше. Результат условного оператора имеет наиболее общий класс (в нашем случае - CoinSide). В большинстве случаев все классы имеют общий тип - Object.
Надо будет проверить ещё с примитивными типами. Будет ли работать auto-boxing?
Авторы рекомендуют всегда использовать последний релиз Java-платформы, так как в последние релизы включены многие улучшения, делающие жизнь программистов легче.
А вот о новых багах, особенно регрессиях, авторы молчат... ;)