Нравится:
- удобная пакетная система (впрочем, такой же может и Python похвастаться);
- удобная система создания/подключения библиотек на Java же;
- JNI --- очень приличный интерфейс (хотя, может, и не меру сложноват; например, у Lua или у Python попроще будет);
- хорошая программа на Java "хорошо выглядит";
- можно на одном хосте держать сколько угодно рантаймов для разных целей.
- нельзя контролировать процесс распределения/освобождения памяти;
- JIT может сожрать кучу памяти на большом приложении для оптимизации и с этим ничего не поделать;
- неудобный механизм Reflections (к слову сказать, Python в этом смысле даст Java 100 очков вперед);
- не используя интерфейсы нельзя разделить контракт класса/модуля и реализацию;
- если Cloneable не в счет, то нет deep copy (в Python есть разные схемы копирования);
- нельзя переопределять операторы;
- нет понятия константного метода класса.
> не используя интерфейсы
ОтветитьУдалить> нельзя разделить контракт
> класса/модуля и реализацию
Это как? Непонял...
Интерфейсы для того и даны, чтобы API описывать не вдаваясь в реализацию...
> нельзя переопределять операторы
Не нужно переопределять операторы.
По крайней мере так, как это делается в C++.
> нет понятия константного метода класса
А что это такое?
Я же сказал "не используя интерфейсы.
ОтветитьУдалитьВ случае интерфейсов может получиться громоздко по нескольким причинам:
1) если методы логически не связаны, но о них надо кому-то сказать, то и интерфейсов должно быть много (и в каждом по одному методу); тогда и появляются классы, имплементирующие толпу интерфейсов;
2) в Java все методы принадлежат классам, поэтому не сказать что-то типа "существует где-то в рантайме метод x с параметрами y и z, который делает то-то и то-то", надо обязательно указать где именно этот метод сидит (скажем, сказать имя класса); а если я обязательно хочу скрыть реализацию этого метода (при таком описании --- явно статического), то не обойтись без костылей, типа, фабрик или провайдеров, которые возвращают интерфейс;
3) интерфейсы могут повлечь за собой толпу приведений типов.
Переопределение операторов может быть очень полезно. Практика программирования на Python (который, в принципе, очень похож на Java) меня в этом убедила. Главное, не переопределять бездумно.
Константный метод класса --- это такой метод, которые не может изменить значения полей класса и также не может вызывать не константные методы. Очень полезное свойство C++, позволяет контролировать логику при программировании. (К слову сказать, в Python такого тоже нет, к сожалению.)
Собственно, все, что я тут излагал --- мое личное мнение и то, что мешает лично мне. Для кого-то другого это может быть совсем не так или вообще наоборот.