Hej
Mam taki kod:
BigInteger bd1 = new BigInteger("987654321");
BigInteger bd2 = new BigInteger("123456789");
BigInteger sum = bd1.add(bd2);
Na jaki obiekt wskazuje teraz zmienna sum
?
Hej
Mam taki kod:
BigInteger bd1 = new BigInteger("987654321");
BigInteger bd2 = new BigInteger("123456789");
BigInteger sum = bd1.add(bd2);
Na jaki obiekt wskazuje teraz zmienna sum
?
Zgodnie z dokumentacją https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
na nowy obiekt typu BigInteger
czyli ani nie bd1
ani nie bd2
.
@szweszwe: A jak to się dzieje, że powstaje nowy obiekt bez jawnej deklaracji tego w sposób new BigInteger()
?
Możesz powiedziec gdzie dokładnie jest to wyjaśnione w dokumentacji?
Tutaj:
add(BigInteger val)
"Returns a BigInteger whose value is (this + val)."
Tutaj masz implementację z OpenJDK: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/math/BigInteger.java#BigInteger.add%28java.math.BigInteger%29
rubesom napisał(a):
@szweszwe: A jak to się dzieje, że powstaje nowy obiekt bez jawnej deklaracji tego w sposób
new BigInteger()
?
Możesz powiedziec gdzie dokładnie jest to wyjaśnione w dokumentacji?
@rubesom: A kto Ci powiedział, że nie ma deklaracji new BigInteger()
? Ona jest w metodzie add
.
Spojrzałem na kod, i niekoniecznie zawsze powstaje nowy obiekt. :) Jeśli któryś jedst zerem, to wynikiem jest ten niezerowy z dwóch. :)
//ciach
if (val.signum == 0)
return this;
if (signum == 0)
return val;
//ciach
Podobnie dla liczb przeciwnych -- zwracany jest nie nowy, a istniejący obiekt ZERO
.
Dokumentacja dla BigInteger https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html zaczyna się od słów:
Immutable arbitrary-precision integers.
Niemutowalny obiekt nigdy nie zmienia swojej zawartości. Stąd każda metoda na BigIntegerze prowadząca do BigIntegera o innej zawartości musi zwracać nowy obiekt. Nawet (niefortunnie nazwana) metoda setBit
. Czasami metoda może zwrócić stary obiekt, ale tylko wtedy gdy wynik operacji jest równy któremuś z argumentów - np mnożenie przez 1 nie zmienia wartości, podobnie dodawanie 0 albo mnożenie 0 przez cokolwiek.
A jak to się dzieje, że powstaje nowy obiekt bez jawnej deklaracji tego w sposób new BigInteger()?
Jeśli wywołasz metodę, która wywołuje new
i zwraca jego wynik to właśnie dostałeś nowy obiekt bez używania samemu słówka new
. Czary mary! :)