Takdy ale vůbec nejde o to, co preferuje Filip Jirsák nebo někdo jiný. Důležité je, co očekává běžný Franta programátor od operátoru ==. Bežný Franta programátor očekává, že to bude porovnávat hodnoty a ne reference a už vůbec neočekává, že se to bude chovat pokaždé jinak podle kontextu.
Pokud běžný Franta programátor očekává něco, co nesplňuje snad žádný programovací jazyk, není programátor. Nebo mi ukažte jazyk, který (alespoň ve výchozím nastavení, tj. bez přetěžování operátorů) porovnává vše podle hodnoty.
běžný Franta programátor je z toho zmatený
Nikoli, programátoři z toho zmatení nejsou a chyby v tom nedělají. Programováním se živím už spoustu let, a že se někdo pokusil v Javě porovnat Stringy pomocí
== jsem viděl jednou, v kódu, který ještě ani nebyl commitnutý.
V oborech, kde se pracuje s vážně s bezpečností, existuje pojem lidský činitel. Člověk je totiž ten nejslabší článek řetězu, který způsobuje nejvíce chyb. Když chceme chyby minimalizovat, musíme přizpůsobit design okolních systémů tak, aby s nimi člověk dokázal co nejlépe a nejintuitivněji pracovat. Chování operátoru == v Javě je podobné, jako kdyby někdo vyrobil letadlo, kde bude výškoměr v první polovině stupnice cejchovaný v metrech a v druhé polovině ve stopách. Samozřejmě by s tím šlo létat (a jsem si jistý, že Filip Jirsák bych to bravurně zvládal), ale u normálních pilotů by to způsobovalo zmatek a zbytečné chyby.
Tady docela hezké počtení k zamyšlení, proč by se měl design systému (programovacího jazyka) přizpůsobit člověku a ne opačně: http://projekt150.ha-vel.cz/node/117
S tím, že se má design systému přizpůsobovat člověku a ne opačně, mi mluvíte z duše, propaguju to kudy chodím. Java se k tomu principu postavila tak, že vychází z několika málo jednoduchých principů, které programátor snadno pochopí. Rozdíl mezi primitivními typy a objekty programátor pochopí snadno, a že
== u primitivních typů porovnává hodnotu (protože není co jiného porovnávat) a u objektů porovnává referenci, zatímco pro porovnání hodnot slouží metoda
equals(), se naučí asi tak v druhé lekci.
Že neprogramátorům vadí chování operátoru
== je mi celkem jedno, moc nechápu, proč to řeší. Že to kritizují jenom u Javy, i když úplně stejně to má C, C++, JavaScript, Python a mnoho dalších jazyků (přičemž jen některé umožňují operátor přetížit), to jenom ilustruje úroveň znalostí.
Programátor vidící poslední 3 řádky na první pohled považuje proměnné a a b za primitivní číselné typy a očekává porovnávání hdnot a tedy shodu. Nemá šanci na pohled poznat, že jsou to ve skutečnosti objekty a že bude porovnávat reference a ne hodnoty.
Upozornění v IDE, že porovnává objekty ho může zachránit, ale ne každý editor kódu to umí.
Ano, lze napsat kód prasácky, a když to pak jiné prase čte a očekává něco, co si neověří, skončí to nejspíš chybným kódem. IDE v tomto případě nepomůže, protože programátoři, kteří vyrábí takovýhle kód, varování ignorují.
Mimochodem, představte si, že v tom vašem příkladu
a bude
float a
b bude
double. A teď si ještě představte, že ten kód bude C. Nebo C++. To máme ale na světě nepoužitelných jazyků, že? A co je v nich napsáno aplikací…