Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
Kit
Redaktor
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  +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
Odpovídá na Kit
Honza Bittner:16.1.2014 12:37

Zajímavé ... :)

Nahoru Odpovědět 16.1.2014 12:37
Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a zeptat na cokoli se mě můžeš na https://github.com/HoBi/...
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
Redaktor
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
Redaktor
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  +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: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
Redaktor
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  +2 18.1.2014 20:02
Avatar
Kit
Redaktor
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  +1 18.1.2014 21:04
:)
Avatar
Jan Vargovský
Redaktor
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  ±0 18.1.2014 21:07
Avatar
Kit
Redaktor
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  +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ý: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  +1 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
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
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  +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: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  +1 18.1.2014 21:52
1 + 1 = 2
Avatar
Silvinios
Redaktor
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  +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.