джава
DevelNext
Понадобилось тут по работе быстро накидать графическую утилиту под Виндоуз, пока шли совещания погуглил инструменты и случайно наткнулся на «ДевелНекст» — развитие «ДевелСтудио», о которой я писал восемь лет назад.
Внутри у неё свой диалект ПХП (JPHP), написанный на Джаве. Отличия от обычного интерпретатора, в основном, в стандартных функциях — они присутствуют не все, но чаще всего есть
С документацией на сайте
Первую версию программы я накидал очень быстро, а потом встрял — мне нужно было по мере выполнения программы показывать индикацию, а она прорисовывалась только после завершения всей работы.
Потерял много времени, пытаясь найти пропавшую с сайта документацию — я догадывался, что всю работу надо выполнять в отдельном треде, чтобы не мешать интерфейсу прорисоваться, но не знал как это сделать. Пока случайно не попал в подраздел «Разного» — оказалось там притаилось решение моей проблемы.
Причём как оказалось, работать надо не просто в отдельном треде, так ещё и изменения интерфейса делать разрешается только через специальную обёртку — функции uiLater и uiLaterAndWait. Пример из документации:
$this->label->text = 'Поток выполняется...';
$thread = new Thread(function () {
sleep(3); // ждем 3 сек.
uiLater(function() {
$this->label->text = 'Поток выполнен.';
});
});
$thread->start();На выходе получается обычный запускаемый файл (в моём случае — 3,3 мегабайта, немного по нынешним временам). Внутри — судя по всему, интерпретатор Джавы и скомпилированная
К сожалению, сразу нашёлся баг — если на компьютере пользователя установлена Джава младше версии 1.8, программа запускаться отказывается. Автор «ДевелНекста» вызвался помочь исследовать эту проблему, надеюсь скоро исправит.
Разобрался: ларчик просто открывался! Я так был уверен, что должен получиться всего один файл, что не понял, что папку jre (где и лежит Джава) надо тоже копировать. Это уже менее интересно, конечно.
Пару слов о Джаве
У ДиБРа увидел прекрасное. Как вы думаете, что выведет следующий код:
public class Main {
public static void main(String[] args) {
Integer a = 10, b = 10;
Integer c = 150, d = 150;
System.out.println(a == b);
System.out.println(c == d);
}
}Как ни странно, но «true» и «false». Насколько я понял по комментариям, это происходит
Почему Java отстой?
Почему Java отстой? Давайте посчитаем.
- Ужасные ограничения вокруг имен пакетов/файлов/каталогов/классов
- Отсутствие анонимных методов
- Отсутствие замыканий (closure)
- Отсутствие
лямбда-выражений - Отсутствие событий/делегатов
- Отсутствие partial классов
- Смешная имплементация перечислений
- Ужасная реализация
generic-ов - Отсутствие структур и как следствие невозможность хранить составные объекты целиком в стеке. Это существенно сказывается на производительности, там где это важно.
- Строки являются неизменяемыми (immutable), но не интернированы (см. intern)
- Нет доступа
к unsafe-коду - Нет get/set методов для свойств
- Нет перегрузки операторов
- Нет extension методов
- Наконец глупая и неинтуитивная расстановка скобок
Сколько причин?
15?Ха-ха-ха!