Avatar
Kit
Redaktor
Avatar
Kit:

Zkusil jsem si následující kód:

System.out.println(Integer.valueOf(127) == Integer.valueOf(127));
System.out.println(Integer.valueOf(128) == Integer.valueOf(128));

s tímto výsledkem:

true
false

Hezké, co?

Odpovědět  +2 16.1.2014 12:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Honza Bittner
Redaktor
Avatar
Nahoru Odpovědět 16.1.2014 12:37
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Paul
Člen
Avatar
Paul:

Vysvětlete prosím někdo v čem je to zajímavé :-D
Ať se něco přiučím...

 
Nahoru Odpovědět 16.1.2014 12:39
Avatar
Kit
Redaktor
Avatar
Odpovídá na Paul
Kit:

Je to zajímavé tím, že to není konzistentní. Buď by to mělo v obou případech vypisovat "true" (stejné hodnoty) nebo "false" (rozdílné objekty). Bral bych spíš to druhé a proto je mi divné, proč pro čísla do 127 je hodnota "true"

Nahoru Odpovědět 16.1.2014 12:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Paul
Člen
Avatar
Odpovídá na Kit
Paul:

Jo to mi mohlo dojít :-D Blbě jsem si ten kód přečetl... A existuje nějaké racionální vysvětlení?

 
Nahoru Odpovědět 16.1.2014 12:49
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:

Javu nedělám trochu googlování http://stackoverflow.com/…l-128-number :) každopádně je to hodně zajímavý

Nahoru Odpovědět 16.1.2014 12:50
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Kit
Libor Šimo (libcosenior):

Určite to má niečo spoločné s tými hodnotami.
Myslím, že keď tam dáš :
System.out.prin­tln(Integer.va­lueOf(127) == Integer.value­Of(127));
System.out.prin­tln(Integer.va­lueOf(126) == Integer.value­Of(126));
výsledky budú true.
(Nemám to vyskúšané)

Nahoru Odpovědět  +1 16.1.2014 12:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

Tak to je ještě hezčí příklad. Díky. Je na tom hezky vidět rozdíl mezi "int" a "Integer", tedy mezi primitivním a referenčním typem.

Nahoru Odpovědět 16.1.2014 13:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na Kit
Silvinios:

Na tom přeci není vůbec nic temného :-)

Stačí se podívat do dokumentace metody Integer.valueOf, kde se jasně píše, že hodnoty -128 to 127 se cachují.
V prvním případě je výsledek true, neboť se jedná o stejnou (cachovanou) instanci třídy Integer.
V druhém případě je výsledek false, protože se jedná o dvě různé instance.

 
Nahoru Odpovědět  +2 18.1.2014 20:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na Silvinios
Kit:

Cache by se měla chovat vždy tak, aby byla transparentní. Tedy dávat stejná data, jako kdyby neexistovala.

Nahoru Odpovědět 18.1.2014 20:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Luboš Běhounek (Satik):

Někdy jsem rád, že v Javě nemusím programovat :D

Nahoru Odpovědět  +1 18.1.2014 21:04
:)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:

Díky, až zas v nějaké konverzaci hejtovat Javu, ukážu mu tohle :)

 
Nahoru Odpovědět  ±0 18.1.2014 21:07
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

Myslím si, že podobná temná zákoutí se dají najít i v C#.

Nahoru Odpovědět  +4 18.1.2014 21:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Mi stačilo, když jsem jednou procházel implementaci třídy Convert. Metoda, která vrací jen true je super (měla dokonce i parametr) :)

 
Nahoru Odpovědět  +1 18.1.2014 21:33
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

Dají, ale pravděpodobně ne u něčeho tak jednoduchého jako je int.

Nahoru Odpovědět 18.1.2014 21:44
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Podívej se pořádně. Tohle se netýká int, ale Integer. To je rozdíl.

Nahoru Odpovědět  +1 18.1.2014 21:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
Benjibs:

To máš pravdu, vykradnúť (čítaj = "inovovať" :P) vymoženosti z ostatných jazykov je less-error-prone.

Nahoru Odpovědět  +1 18.1.2014 21:52
1 + 1 = 2
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na Kit
Silvinios:

Téma diskuze by se mělo jmenovat temná zákoutí ve znalostech Javy :)

Pokud potřebuješ porovnat hodnoty, použij metodu equals. Pokud potřebuješ porovnat reference, použij operátor ==.

 
Nahoru Odpovědět  +1 19.1.2014 13:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.