the mine universe

среда, 4 декабря 2013 г.

Java большими круглыми глазами сквозь очки .NET

“Какую книгу посоветуете почитать” – любимый вопрос начинающего изучать Java. Первая которая мне попалась - Java Concurrency in Practice, Addison Wesley, http://amzn.com/B004V9OA84 Первое впечатление от книги – все очень просто и понятно, потому что похоже на .NET.

Пока не открыл IDEA. То есть я читал книгу ни строчки на java 1.6 не написав. Вообще IDEA самый простой ключ к освоению JAVA с .NET-ом за плечами. Я имею ввиду похожие шорткаты в R# и IDEA. Так сложилось я начал пользоваться RE# с 1й версии и всегда пользуюсь idea keyboard schema в visual studio

JAVA это очень непонятно, вот первые впечатления от языка:

Нет out-параметров, каждый решает проблему по своему. Проходит через пару недель реабилитации в форме активного портирования .NET паттернов в JAVA. Пиши в комментариях что делаешь ты вместо out.

Нет сборок. IDEA по умолчанию предлагает все зависимые библиотеки запаковать в один свой JAR. У всех проблемы с деплойем приложений на Application Server – это, по моему, самая популярная проблема в JAVA.

Нет сборок – нет подписи сборок. Ты не можешь быть уверен какая именно версия попадет в продакшн. Пишите в коментариях если я не прав.

Нет замечательных аннотаций @Immutable, @ThreadSafe, @NotThreadSafe и @GuardedBy. Эти аннотации как оказалось есть только в книге. Читаю книгу и все время думаю а почему я за 12 лет программирования на .NET сам не догадался помечать код такими атрибутами?!

Нет привычного Windows окружения с хорошей интеграцией в .NET:

  1. Службы Windows & IIS
  2. Integrated Security
  3. Простота обслуживания БД в SQL Server/Express.
  4. Поддержка cross-process concurrency в SQL Server Compаct.
  5. Нет cross-process interop с помощью named pipe.

По порядку.

1. Java – кросплатформенная. На каждой платформе своя демонизация. В линаксе их две я насчитал, в MAC OS lauch daemons, в Windows шестая. А еще есть FreeBSD, Solaris, и прочие HP-UX.

2. Integrated Security отcутствует и достает больше всего каждый день. У каждой службы свои БД логин/пароль, у кажого хоста свои логин/пароль. Если хочешь например по расписанию синхронизировать две БД mysql, то изволь предъявить три пары логин/пароль.

3. Простота обслуживания БД в SQL Server/Express это больше проблема клиентов, но если будет выбор у клиента при прочих равных выберет ту что проще обслуживать.

4. Вот спроси у любого .NET программиста или архитектора, не знакомого с java, в чем киллер фича SQL Server Compact. Ни один дотнетчик не скажет “cross-process cuncurrency”. А в java я пока не нашел ни одной реализации embedded rdbms с поддержкой cross-process concurrency. Что бы не тратить место в коментариях поясню. В .NET ты можешь стартовать и завершать множество процессов в любом порядке как будто они не знают ничего друг о друге. Например запустить A, потом B, потом А остановить, и запустить C. Потом Еще запустить А четыре раза, потом всех кроме C остановить и сначала по кругу. Все процессы будут “параллельно” работать с одной БД не мешая друг другу. В Java так просто нельзя. Надо назначить кого самым долгоживущим процессом, открыть на нем листенер и все остальные процессы должны обращаться через эту TCP/IP связь. Это не то чтобы проблема, но очень ограничивает свободу которой так гордится java-сообщество.

5. Тема узкая. Не буду вдаваться. В лиуксе есть сокеты, но java не только линукс. Поясню. Надо, допустим, часть кода вынести в отдельный процесс. Причины разные могут быть, редко, но бывают. Поверх named pipe удаленный вызов удобнее чем поверх линукс-сокетов. Хотя бы тем что права на named pipes не перемешаны с правами на файловую систему.

Еще нет глобального ThreadPool. В java надо самому решать кто его создаст, когда, с какими настройками, и когда уничтожит.

Ярлыки (Tags)