Java: najlepszy sposób przekazywania int przez odniesienie

84

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.

fred basset
źródło
13
Integerjest niezmienna.
Yuval Adam
1
Jeśli chcesz uniknąć biblioteki Apache, możesz przekazać int i zwrócić zaktualizowaną wartość. Jeśli są to dwie wartości, zalecam użycie Point jako kontenera. W przeciwnym razie opcja tablicy lub jedna z innych sugestii tutaj jest w porządku.
EntangledLoops
Powinieneś zwrócić int lub obiekt; Jeśli naprawdę potrzebujesz więcej niż jednego, być może powinieneś przemyśleć projekt swoich zajęć
Ujjwal Singh

Odpowiedzi:

72

Możesz spróbować użyć org.apache.commons.lang.mutable.MutableIntz biblioteki Apache Commons. Nie ma bezpośredniego sposobu, aby to zrobić w samym języku.

doublep
źródło
24

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. IntHolderOpakowaną int.

mikej
źródło
20

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 MutableIntto dobra opcja. Innym, nieco bardziej zaciemnionym sposobem jest użycie int[]sugerowanego przez ciebie sposobu. Nie użyłbym tego, ponieważ nie jest jasne, dlaczego intpakujesz tablicę jednokomórkową.

Zauważ, że java.lang.Integerjest to niezmienne.

Yuval Adam
źródło
A co z użyciem AtomicInteger? Czy jest to zmienne i przekazywane przez odniesienie? (Afaik AtomicReference <Boolean> robi to poprawnie).
icbytes
18

Możesz użyć java.util.concurrent.atomic.AtomicInteger.

user3070377
źródło
14

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.

John Kugelman
źródło
6
Dokładnie. Nie zmuszaj Javy do robienia tego po swojemu, rób to po swojemu. Java to nie C. Próby sprawienia, by działała jak C, zawsze będą brzydkimi włamaniami.
Skip Head
9

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ć intejako argument, w którym chcesz przekazać zmienną całkowitą:

public void function(Inte inte) {
some code
}

więc do aktualizacji wartości całkowitej:

inte.x=value;

za uzyskanie wartości:

Variable=inte.x;
Anoos Sb
źródło
8

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.

Mickael Bergeron Néron
źródło