Úplne na začiatok musím povedať, že nemám rád sväté vojny v IT. To sú tie nekonečné diskusie o tom, ktorý prehliadač, programovací jazyk alebo operačný systém je ten najlepší. Nie že by nemalo zmysel porovnávať. Skôr nemá zmysel hľadať víťaza. Myslím si, že akýkoľvek produkt, ktorý na trhu vydržal aspoň 5 rokov, tu má miesto. Ani tento článok nemá za cieľ hľadať víťaza (a rozpútať tak svätú vojnu). Skôr len porovnať dva svety, ktoré majú veľa spoločného a zároveň odlišného.
Ako druhú vec musím povedať, že sa nepovažujem za .Net alebo Java guru. Aj keď sa v obidvoch oblastiach celkom intenzívne pohybujem, videl som dosť na to aby som vedel, že je toho omnoho viac, čo by som mal vedieť. Preto sa môže stať, že niektoré moje závery budú plynúť práve z tejto neznalosti a možno existuje nástroj alebo spôsob, o ktorom neviem, a ktorý problém rieši. Ako poslednú vec musím povedať, že porovnávať budem programovanie v C# pre .Net 2.0 (s miernymi odskokmi k novším verziám) a v Jave pre Java SE 1.7.
Čo majú Java a .Net spoločné
Spoločného majú tieto jazyky viac ako odlišného. Oba sú to čisto objektovo orientované jazyky s veľmi podobnou syntaxou. Oba podporujú aj zložitejšie mechanizmy, ako sú generiká alebo atribúty/anotácie. Oba majú obrovské množstvo knižníc tretích strán, ktoré ich umožňujú používať skoro pre akékoľvek účely. Oba sú však cielené hlavne pre informačné systémy, kde by vďaka ich vlastnostiam mal prebiehať tzv. Rapid development. V takomto zozname by som mohol pokračovať ďalej, ale je fakt, že ak ste doma v jednom z týchto svetov, dostať sa do druhého nebude až taký problém. Musíte len preklenúť rozdiely.
Čo majú Java a .Net rozdielne
Starší má prednosť alebo bod pre Javu
Java je tu dlhšie ako .Net. Prvá verzia Javy bola zverejnená v roku 1996. Prvá verzia .Net až o 5 rokov neskôr. To umožnilo Jave pomerne dlhú dobu pôsobiť v oblasti, kde nemala priamu konkurenciu (nie že by v tom čase neboli iné programovacie jazyky, skôr len nie iné s niečim, ako je napríklad Garbage Collector). Dlhšia história priniesla viac dokumentácie, knižníc a väčšiu komunitu. 5 rokov v svete IT môže znamenať jednu programátorskú generáciu a Java v tomto čase mala veľa priestoru rásť. Verím, že to je jeden z dvoch dôvodov (k druhému sa dostanem onedlho), prečo je Java tradične pred C# v štatistikách o rozšírenosti jazyka. Mimochodom, toto má priamy vplyv na množstvo pracovných ponúk pre jednu alebo druhú platformu.
Syntaktický cukor alebo bod pre .Net
.Net je teda mladšia platforma. A to môže mať aj svoje výhody. Môže sa totiž poučiť od svojich predchodcov a urobiť niektoré veci inak. Java sa mení a vylepšuje tiež. Ale dá sa povedať, že na svojom poli vznikala ako jedna z prvých a nemala sa veľmi od koho učiť. V prípade .Net-u už to bolo inak. Jedna z vecí, ktorá je v Jave strašná, je “event handling”. Aby ste rozumeli, tak strašná znamená, že sa na to zle pozerá. Aby ste ošetrili nejakú udalosť, tak si potrebujete vyrobiť triedu implementovaním Listere rozhrania alebo odvodením od pripravenej triedy, ktorá ho už implementuje. V každom prípade sa to najčastejšie rieši anonymnou triedou. Vo väčšine literatúry som sa stretol s názorom, že anonymné triedy treba používať, ale len s mierou. Keďže je to ale jediný naozaj „rapid“ spôsob ako ošetrovať udalosti, tak miera musí ísť často bokom. .Net má na rozdiel od Javy jednoduchý koncept udalosti, pričom je možné pripojiť sa na udalosť pomocou jednej alebo viacero metód.
Druhá čitateľnejšia vec sú .Net properties. V konečnom dôsledku sú to dvojice set a get metódy, ale v jazyku vyzerajú skôr ako vlastnosti objektu, ktoré sa dajú nastavovať. Ušetrí to síce len práve tie slovíčka „get“ a „set“ a nejaké zátvorky, ale to prispieva k čitateľnosti, keďže Property v .Net-e je skôr vlastnosť a metóda je činnosť objektu.
Obe tieto veci sú v podstate syntaktický cukor, pretože nepridávajú jazyku na sile. Rozdiel je ale v čitateľnosti. Sú to totiž ďalšie dva nástroje, ktoré je možné pri modelovaní triedy a sústav tried používať, a čím viac nástrojov je k dispozícii, tým lepšie je možné modelovať objekty. A kvalitné modelovanie objektov je základom pre objektovo-orientovaný programovací jazyk.
Komplexnosť ako tichý zabiják alebo bod pre .Net
Java má na rozdiel od .Net-u mnoho spoločného s open-source svetom. A tiež si odtiaľ niečo priniesla. Napríklad modularitu a slabé väzby. Tie zvyšujú flexibilitu, ale zároveň so sebou prinášajú komplexnosť. Teraz hovorím o Class Path v Jave a o veľkom množstve a spôsobe použitia Java knižníc. Je ich omnoho viac, pričom sú drobné a je nutné ich vyskladať všetky na Class Path, aby ste mohli aplikáciu spustiť. V .Nete je podobný princíp, ale knižnice sú zväčšia väčšie a často si všetky závislosti prinesú so sebou.
Java bohužiaľ potrebuje nástoje ako je Maven alebo Apache Ivy, aby prichystal všetko potrebné. Sú to komplikované nástroje, ktoré riešia komplexný problém. A komplexnosť je vždy tichým zabijákom softvérových produktov (niečo ako cholesterol u ľudí).
Som zadarmo alebo bod pre Javu
Java je zadarmo. Ja viem. Aj .Net je zadarmo. Ale Java je viac. V .Nete viete vyvíjať po nejakú hranicu zadarmo. Ak však chcete pokračovať (väčší tím, veľký projekt alebo nejaké špeciálne funkcie), musíte začať uvažovať nad platením. Nemám samozrejme na mysli samotný framework. Skôr len prostriedky a súvisiaci softvér. Napríklad vývojové prostredie – Visual Studio. S express verziou sa môžete naučiť programovať. Ale po čase vám začnú chýbať funkcie z vyšších verzií. A alternatívne zadarmo neexistujú (teda existuje napríklad Sharp Develop – ale ten sa Visual Studiu Profesional nevyrovná). Na druhej strane máte v Jave NetBeans alebo Eclipse, ktoré sú zadarmo aj s neskutočným množstvom doplnkov. Taktiež čo sa týka knižníc tretích strán, tak tých platených je v svete .Net omnoho viac ako v svete Javy.
Som všade alebo bod pre Javu
Nepopierateľná výhoda Javy je multiplatformovosť. Tam je .Net dosť vzadu. Aj keď, čo sa týka používateľských staníc, je pri prevahe Windows stále skoro to isté, v oblasti serverov je to citeľný rozdiel. Možnosť napísať aplikáciu a pritom neriešiť, aký je cieľový operačný systém (čo sa týka tých mainstreamových), je nepopierateľná výhoda.
Kedysi Java za túto vlastnosť platila pomalosťou. Bola to jednoducho cena za ďalšie vrstvy, ktoré jej umožnili byť platformovo nezávislé. Dnes to už ale tak nie je a posledné verzie Javy sa v rýchlosti vyrovnajú aj .Net-u.
Ak ste došli až sem, pokúsili sa zrátať body, tak možno máte víťaza. Ale ako som písal na začiatku, nebol cieľ ho nájsť, a preto ani súčet bodov vám ho reálne nedá. Obidve platformy majú klady a zápory a obe sú podľa mňa použiteľnejšie. Zaujímavé je tiež, akým smerom sa momentálne uberajú. C# v .Net-e získal niekoľkými poslednými verziami mnoho vlastností, ktoré súvisia so slabotypovosťou alebo funkcionálnym programovaním. U Javy zďaleka taký posun nenastal, ale veľa sa deje v tom, aby Java ako platforma mohla hosťovať mnoho rôznych jazykov s rôznymi vlastnosťami (Scala, Groovy …). Takže je to jeden rozsiahly jazyk voči skupine špecializovaných. Uvidíme…