Mam funkcję parsowania, która analizuje zakodowaną długość z bufora bajtowego, zwraca przeanalizowaną długość jako int i pobiera indeks do buforu jako liczbę całkowitą arg. Chcę, aby funkcja aktualizowała indeks zgodnie z tym, co jest analizowane, tj. Chcę przekazać ten indeks przez odniesienie. W C po prostu zdałabym int *
. Jaki jest najczystszy sposób na zrobienie tego w Javie? Obecnie szukam możliwości przekazania argumentu indeksu. jako int[]
, ale jest trochę brzydki.
java
pass-by-reference
fred basset
źródło
źródło
Integer
jest niezmienna.Odpowiedzi:
Możesz spróbować użyć
org.apache.commons.lang.mutable.MutableInt
z biblioteki Apache Commons. Nie ma bezpośredniego sposobu, aby to zrobić w samym języku.źródło
Nie jest to możliwe w Javie. Jak zasugerowałeś jednym ze sposobów jest przekazanie pliku
int[]
. Innym byłoby mieć małą klasę, np.IntHolder
Opakowanąint
.źródło
W Javie nie można przekazywać argumentów przez odwołanie.
Co możesz zrobić, to opakować swoją wartość całkowitą w zmienny obiekt. Korzystanie z Apache Commons
MutableInt
to dobra opcja. Innym, nieco bardziej zaciemnionym sposobem jest użycieint[]
sugerowanego przez ciebie sposobu. Nie użyłbym tego, ponieważ nie jest jasne, dlaczegoint
pakujesz tablicę jednokomórkową.Zauważ, że
java.lang.Integer
jest to niezmienne.źródło
Możesz użyć
java.util.concurrent.atomic.AtomicInteger
.źródło
Zawiń bufor bajtów i indeks do obiektu ByteBuffer . ByteBuffer hermetyzuje koncepcję bufora + pozycji i umożliwia odczytywanie i zapisywanie z indeksowanej pozycji, którą aktualizuje w miarę postępów.
źródło
Możesz zaprojektować nową klasę w ten sposób:
public class Inte{ public int x=0; }
później możesz stworzyć obiekt tej klasy:
Inte inte=new Inte();
wtedy możesz przekazać
inte
jako argument, w którym chcesz przekazać zmienną całkowitą:public void function(Inte inte) { some code }
więc do aktualizacji wartości całkowitej:
za uzyskanie wartości:
źródło
Możesz utworzyć klasę Reference, aby zawijać prymitywy:
public class Ref<T> { public T Value; public Ref(T value) { Value = value; } }
Następnie możesz utworzyć funkcje, które przyjmują odniesienie jako parametry:
public class Utils { public static <T> void Swap(Ref<T> t1, Ref<T> t2) { T temp = t1.Value; t1.Value = t2.Value; t2.Value = temp; } }
Stosowanie:
Ref<Integer> x = 2; Ref<Integer> y = 9; Utils.Swap(x, y); System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value"; // Will print: x is now equal to 9 and y is now equal to 2
Mam nadzieję że to pomoże.
źródło