Re: вопросы новичка о языке
От: gegMOPO4  
Дата: 22.09.11 06:47
Оценка: 7 (2)
Здравствуйте, баг, Вы писали:
баг>Впервые столкнулся с этим языком, возникли вопросы.

Если пришли со стороны C/C++, то главное уяснить одну вещь — в Java используются иногда подходы и решения, которые грамотному сишнику и в голову не придут. В частности, нормальным считается кратковременное выделение динамической памяти, множественные проверки всего и вся, многоуровневая косвенность, распространена рефлексия. Как ни странно, это не слишком сказывается на производительности.

баг>1. Привычное множественное наследование: есть класс-родитель, есть класс-дитё, есть третий класс с неким функционалом, который хочется использовать, но нельзя.

баг>Какие шаблоны для выхода из ситуации? Третий класс в виде члена дитя, статические методы в персом? Что ещё?

Множественное наследование и в C++, имхо, было ошибкой. Как уже правильно сказали, правильный ответ — агрегация.

баг>2. Множественные результаты функции. В других языках есть передача по ссылке, в Яве вроде как нету этого. Как прикажете возвращать? Заворачивать в новый класс и возвращать его? Или есть может что-то обобшённое вида туплов (tuple)?


Да, с этим плохо. Но и в C++ не очень хорошо без множественного присваивания и автораспаковки pair/tuple. Да, оборачивают в новый класс. Или модифицируют изменяемый параметр (массив, коллекцию).

баг>3. Сериализация. В С++ просто: объявил структуру и привёл к ней любой участок памяти. В Яве? Собственный DataInputStream и ObjectInputStream? Или как ещё парсят сетевые бинарные протоколы?


Вот в C++ это плохой, ужасный способ. Проблемы с переносимостью — разные размеры, эндинг, представление, выравнивание. Которые могут изменяться даже в одном компиляторе при разных опциях. Проблема с безопасностью — сериализируются и дыры в структуре. Надёжный и безопасный способ — явная упаковка/распаковка в байты, в Java для этого используется DataInputStream или вручную.

баг>4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?


Анонимные классы, реализующие интерфейс (аналог функторов C++, но удобнее). Это более универсальный способ, хотя и более громоздкий, по сравнению с указателем на функцию. Выше я упомянул EventHandler, но вам это не надо.

баг>5. Беззнаковые типы


Их нет. Частично это компенсируется беззнаковым сдвигом, BigInteger, BitSet.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.