IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Temná zákoutí Javy

Aktivity
Avatar
Kit
Tvůrce
Avatar
Kit:16.1.2014 12:33

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
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
Tvůrce
Avatar
Odpovídá na Kit
Honza Bittner:16.1.2014 12:37

Zajímavé ... :)

Nahoru Odpovědět
16.1.2014 12:37
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Paul
Člen
Avatar
Paul:16.1.2014 12:39

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
Tvůrce
Avatar
Odpovídá na Paul
Kit:16.1.2014 12:46

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:16.1.2014 12:49

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
Tvůrce
Avatar
Odpovídá na Kit
Petr Nymsa:16.1.2014 12:50

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):16.1.2014 12:55

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
16.1.2014 12:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Kit:16.1.2014 13:03

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
Tvůrce
Avatar
Odpovídá na Kit
Silvinios:18.1.2014 20:02

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
18.1.2014 20:02
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Silvinios
Kit:18.1.2014 20:20

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:18.1.2014 21:04

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

Nahoru Odpovědět
18.1.2014 21:04
https://www.facebook.com/peasantsandcastles/
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Kit
Jan Vargovský:18.1.2014 21:07

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

 
Nahoru Odpovědět
18.1.2014 21:07
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Kit:18.1.2014 21:13

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

Nahoru Odpovědět
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ý
Tvůrce
Avatar
Jan Vargovský:18.1.2014 21:33

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
18.1.2014 21:33
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:18.1.2014 21:44

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

 
Nahoru Odpovědět
18.1.2014 21:44
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:18.1.2014 21:46

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

Nahoru Odpovědět
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:18.1.2014 21:52

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

Nahoru Odpovědět
18.1.2014 21:52
1 + 1 = 2
Avatar
Silvinios
Tvůrce
Avatar
Odpovídá na Kit
Silvinios:19.1.2014 13:52

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
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.