Предлагаю мирно пообщаться на тему известных косяков языка и платформы Java. Можем многое почерпнуть для себя от других людей. Цель беседы - не холивар, потому прошу постараться уменьшить хвальбу других языков и просто банальных спорных выкриков. Аргументы желательно приводить в наиболее близкой к правде форме, выражаться наиболее корректно. Например вместо «Java тормозит» нужно писать «Java-приложение часто использует больше памяти чем программы на других платформах» или «JVM достаточно долго запускается». Некорректность первого высказывания проявляется в очень большой расплывчатости и простыми опровержениями на бенмарках, отставание от С/С++ небольшое. Может выплывает какая-то идея, которую потом успешно в фичреквест.
Итак, что я вижу
- Java-приложение часто использует больше памяти чем программы на других платформах
- JVM достаточно долго запускается
- Отсутствие поддержки хвостовой рекурсии
- Type erasure
- На практике необходимость в лаунчерах, которые устанавливают опции JVM. Некоторые из опций (переменных окруженя Java) должны быть установлены строго перед запуском JVM, а не потом в коде. Пример - java.library.path. Если вернуться к лаунчерам, то было бы удобно иметь возможность написать в самой программе простой, очень ограниченый по возможностям код на самой Java, который установит эти опции для главного запуска JVM. Если вас устраивает отдельный jar/exe/скрипт - говорите. JNLP разве что, но вы считаете это полным решением?
- System.console() - какая-то убогая и непонятная концепция. Он не null только в реальном терминале, а System.out уже рекомендуют не использовать. Что скажете делать, простой вывод в консоль делать через Logging, городить свой велик или постоянно проверять на null?
- Сливание по маркетинговой привлекательности среди быдлокодеров тому же C#. Хоть это огромный плюс, но людей надо манить к себе, в том числе и маркетингов, в том числе и быдлокодеров - вдруг поумнеют. В C# 99% отличий от Java более чем не нужны, но выглядят заманчиво для незадумывающихся, да и код короче. Вот и переходят массово на темную сторону силы. В моем окружении толпами валят с кошерной Java на C# в стразах. Аргументы - свойства, делегаты, лямбды (также известные как синтаксический сахар, плохой дизайн и частный случай анонимных классов). Хоть Linq еще ничего, но боян еще тот.
- Swing мощный, но тяжелый. На десктопах побеждает легкость.
- Игнор со стороны Linux десктопов. На Java пишутся легкие и быстрые приложения для десктопа путем простого использования java-gnome вместо Swing. Исправить недостатки java-gnome и юзать OpenJDK в 100500 раз проще чем наваять с нуля Mono и MonoDevelop, написать на нем кучу софта, а потом выпиливать его в связи с патентной угрозой. Вот не вытерплю - напишу 100500 плеер, только на Java Gnome, который будет сначала хотя бы для начала ничем не хуже многих других. Ни по скорости, ни по легковесности, ни по сложности написания.
- Надо популяризировать Java для полноценных 3D игр (сразу после того как допилить для игр). Почему XNA может, а мы нет? Что, Java не Everywhere?
- Поддержка трея безконечно ужасна
- Clutter есть, WPF есть, Qt умеет. Rich GUI давно уже надо сделать нормальный. Закопали JavaFX, молодцы, отстали от мира на сто шагов. Такое можно делать только будучи уверенны, что догонят и перегонят
- Брендинг, маркетинг царя Java - Oracle ужасен в целом. Он некрасив (начиная даже с сайта) и сливает тому как это делала Sun. У нее свои были недостатки, но даже сайт sun.com, названия, логотип OOo и их офигенный шрифт привлекали очень сильно. Обращаю внимание на мелочи )
Крайне несогласен с мифами, которые точно будут называть в этой теме
- Java устарела. Нет, Java выдержана и консервативна - разницу надо видеть.
- Java тромозит. Если уж говорите, то указывайте когда и как
- Java закрыта. Use OpenJDK
- Java для быдлокодеров. Я думаю что по сравнению с Java 95% ЯП - для быдлокодеров
- C# намного фичастее. Сам язык конечно фичастее, кто бы спорил. Синтаксического сахара - гора. Неочевидных моментов острелить себе ноги - еще больше, cоорудить прибитые гвоздями к друг-другу модули -ничего нет проще. Следует видеть разницу в возможности написать качественный код на C# и громадной провокацией написать говно. Java дисциплинирует и не отвлекает свистоперделками. На работе было дело - целый вечер спорили как соорудить класс в C# снаружи, чтобы было удобно пользователю. На Java реализовали бы сразу - там подход стандартный практически всегда. Метод, конструктор, геттер/сеттер - далеко не прыгнешь. Думаешь только о важных вещах, а не о такой ерунде. Можно было и не спорить, ССЗБ, но провокация есть провокация и вечер угроблен.
- Java - дорогое решение. Для очень дешевых вещей - дорогое. Для качественных вещей - подешевле альтернативных подходов.
- SWT решает проблему громоздкости GUI в Java. Не решает, чистой воды брендинг. Что Eclipse что NetBeans практически одинаковы по функционалу и по ОЗУ. Решения нет. Может хоть в Linux есть Java Gnome, вот он и решает. Байндинг к Qt не смотрел подробно.
Особо нетерпимых модераторов прошу не удалять. Долго писал. Да и врядли будет вред от этой темы в Толксах.