Ne, tohle neni nemusi byt zadna hruba chyba a doufam, ze tyhle nesmysly nevykladate juniorum. Je presne definovano, kdy se to rovnat musi a je to i zduvodnene. Naopak idealne by se chtelo, aby se to rovnalo, ale z performance duvodu to neni vyzadovane v celem oboru platnosti danych typu. Rikate to presne opacne nez to je.
Je to hrubá chyba. V Javě je opravdu přesně definováno, kdy operátor
== při porovnání objektů vrací
true – tehdy a jen tehdy, když se jedná o tytéž objekty (tj. stejné místo v paměti), nebo když jsou obě reference
null.
String ani
Integer nikdy nebyly v Javě definovány jako singletony, v žádném oboru hodnot. To, že mají vedle klasického konstruktoru také statické metody, které dělají jistou optimalizaci při vytváření instancí, na to nemá vliv.
To, co jste citoval, je popis toho, že pro určité hodnoty, u kterých se očekává časté použití, je udělaná optimalizace, aby se nevytvářely stále nové instance. Je to tedy čistě z výkonnostních důvodů, a ve specifikaci je to proto, aby bylo možné se na to spolehnout a někdo si neimplementoval vlastní pool instancí. V tom popisu ale není nic o tom, že se ty hodnoty mají porovnávat operátorem
==. Je tam jenom přesná specifikace, že v takových případech budou instance identické tehdy a jen tedy, pokud jsou identické i hodnoty. Vám to jistě připadá samozřejmé, ale specifikace má být přesná a popisovat i to, co se zdá samozřejmé.