Toto je časté revanie malých detí, ktoré si myslia, že keď napíšu
kód v Jave, tak sú programátori. Je to naozaj silný pocit
prehnať kód javac kompilátorom a potom si myslieť, že toto
je „programový kód“. java je však v skutočnosti interpretovaná, preto
sa jedná o „skriptovací kód“.
Mýtus: Microsoft okopíroval Javu.
Fakt: citácia z knihy JSP – Java Server Pages, Barry Burd,
2003 Computer Press:
Poohlédněme se teda za historií objektů typu JavaBeans. Ke knoci
devadesátých let minulého století se programátoři ve vývojovém týmu
firmy Sun Micrososystems dívali přes rameno svým kolegům v Redmondu. A co
spatřili? Dozrávajíci model komponentového softwaru známý jako
COM – neboli Microsoft Component Object Model. Objekty modelu COM
byly z oblibou používány na webových stránkach známých pod označením
ASP – Active Server Pages. Odpovědí firmy Sun byla specifikace JavaBeans
(jako součást sady JDK 1.1).
Tento odstavec presne naznačuje, že Sun sa nechal inšpirovať
komponentovým modelom COM od Microsoft-u.
Java jazyk vs. C#
Microsoft, ktorý údajne okopíroval Javu, sa pri návrhu jazyka C# (ktorý
je syntakticky oveľa viacej podobný na C++ než na Javu) inšpiroval: autori
C# zistili, že checked a unchecked exceptions sú úplná zbytočnosť, C# má
narozdiel od Javy aj Vlastnosti, Delegátov, skutočné Udalosti a iné
vymoženosti.
.NET narozdiel od Javy má skutočné generické typy – Java kompilátor
odstráni informáciu o typovosti generických typov (tzv. erasures) – teda
tieto informácie, nerozdiel od .NET, nie sú dostupné pomocou reflexie za behu
programu. Podobne je tomu aj s atribútovým programovaním. Zatiaľ čo
Java má v poslednej verzii úbohú podporu pre anotácie
(veľmi zjednodušená obdoba atribútov), .NET už vo svojej prvej
verzii podporuje plnohodnotnú prácu s atribútmi i pomocou reflexie. Plno
„killing“ (alebo „that rocks!“) vlastností .NET-u je založených
práve na atribútoch.
Ďalšie rozdiely medzi C# a Javou: Java vytvára všetky metódy ako
virtuálne (explicitne treba zákazať pomocou final). C# (a
.NET MSIL kód) ide presne opačnou cestou: virtuálne metódy treba explicitne
označiť. Deklarácia implementácie rozhrania alebo rozširovania triedy sa
v C# označuje operátorom : (ako v C++). Java používa
kľúčové slová extends a implements. .NET
(a teda aj C#) umožňujú explicitnú implementáciu
rozhrania – Java nie.
Hodnotové a referenčné typy
Java obsahuje primitívne typy (ktoré sú naozaj primitívne a
nedá sa s nimi robiť pomocou OOP – iba pomocou procedúr
zaobalených do tried). .NET dotiahol unifikovanú OOP prácu s dátovými
typmi takmer k dokonalosti – existujú hodnotové a referenčné typy,
ktoré všetky dedia zo System.Object. Takto je skutočne zaručené, že
všetky dátové typy dedia z jediného rootového typu. V Jave je toto
obchádzané pomocou zaobalovacích tried. Základné dátové typy (bool, int,
long, double, DateTime) sú hodnotové – tzn. vždy majú priradenú
hodnotu. Takto sa vás nestane, že kompilátor za vás boxuje/unboxuje
hodnoty, vy máte podmienku if (!isEditMode) { … } a zrazu
dostanete NullPointerException.
Java Virtual Machine vs. .NET Runtime
Javisti si celkovo mýlia pojmy s dojmami a ani poriadne nerozlišújú
medzi jazykom Java, jazykom C# a ich spúšťacími prostrediami – Java
Virtual Machine a .NET Runtime. Mýtus okopírovania .NET modulu manažovanej
správy pamäte vychádza práve z podobnosti správy pamäte v Jave. Treba
však podotknúť, že manažovanú správu pamäti má aj PHP, Python, či
JavaScript.
Finalizácia objektov je v .NETe oveľa lepšie vymyslená ako v JVM. .NET
Garbage Collector umožňuje volať finalizátory (C# deštruktory) a podporuje
IDisposable
pattern. Ako som sa dočítal na webe, v Jave nie je vôbec zaručené
vykonanie finalize() metódy a zdroje sa uvoľňujú v try/catch bloku. Vďaka
definovanie IDisposable patternu a deštruktorom je možné správne uvoľniť
zdroje, aj keď programátor spraví chybu a nepoužije napr.
using() blok. Čo je ďalšia vec, ktorú jazyk Java nemá:
blok using vygeneruje pre IDisposable objekty
kompletný try/finally blok a dojde teda k správnemu a včasnému odstráneniu
zdrojov.
No, to som sa ale rozpísal 🙂 Ako je vidieť, .NET ponúka oveľa
bohatší programový model, ktorý je konzistentný a je založený na
zdrojovom kóde (to je moje označenie. Java totiž strašne veľa vecí
definuje iba v rôznych dokumentoch a špecikáciách (napr. JavaBeans a ich
„vlastnosti“ = get, set, is). .NET vďaka využitiu atribútov poskytuje
celé riadenie kompilátora, alebo vývojového prostredia zo zdrojového
kódu.).
Človeka, ktorý píše skripty v Jave a hovorí si „programátor“, som
určite nepresvedčil, že .NET a C# nie sú kópiou Javy. Ale ponúkol som
prehľad výborných funkcií, ktoré nemajú svoj ekvivalent v Jave a vďaka
ktorým viem, že som sa pred niekoľkými rokmi rozhodol správne, keď som sa
začal učiť používať .NET platformu.
Aktulizácia: A skoro som zabudol na to, že pre .NET už
môžete programovať vo vyše 30 jazykoch.