2010-07-24 12 views
67

Mam funkcję parsowania, która analizuje zakodowaną długość z bufora bajtów, zwraca sparsowaną długość jako int i bierze indeks do bufora jako arg liczby całkowitej. Chcę, aby funkcja aktualizowała indeks zgodnie z jego analizą, tj. Chcesz przekazać ten indeks przez odniesienie. W C po prostu przekazać int *. Jaki jest najczystszy sposób na zrobienie tego w Javie? Obecnie patrzę na przekazanie indeksu arg. jako int[], ale jest nieco brzydki.Java: Najlepszy sposób przekazywania int przez odniesienie

+11

'Integer' jest niezmienny. –

+0

Jeśli chcesz uniknąć biblioteki apache, możesz przekazać int i zwrócić zaktualizowaną wartość. Jeśli są to dwie wartości, polecam używanie Point jako kontenera. W przeciwnym razie opcja tablicy lub jedna z pozostałych sugestii jest w porządku. – EntangledLoops

+0

Powinieneś zwrócić int lub obiekt; Jeśli naprawdę potrzebujesz więcej niż jednego, być może powinieneś przemyśleć swój projekt "klas". –

Odpowiedz

67

Możesz spróbować użyć org.apache.commons.lang.mutable.MutableInt z biblioteki Apache Commons. Nie ma bezpośredniego sposobu robienia tego w samym języku.

13

Nie można przekazywać argumentów przez odwołanie w Javie.

Co można zrobić, to zawrzeć wartość całkowitą w zmiennym obiekcie. Używanie Apache Commons 'MutableInt jest dobrym rozwiązaniem. Innym, nieco bardziej zaciemnionym sposobem, jest użycie takiego, jak sugerowałeś. Nie użyłbym tego, ponieważ nie jest jasne, dlaczego owijasz w jedną komórkę tablicę.

Pamiętaj, że java.lang.Integer jest niezmienny.

+0

A co z wykorzystaniem AtomicInteger? Czy jest to zmienne i przekazywane przez referencję? (Afaik AtomicReference robi to poprawnie). – icbytes

+1

Tak, icbytes. AtomicInteger to dobra opcja. – Prasath

19

Nie jest to możliwe w Javie. Jak sugerujesz, jednym ze sposobów jest przekazanie int[]. Innym byłoby mieć trochę klasy, np. IntHolder, który opakował int.

13

Owiń bufor bajtów i indeks do obiektu ByteBuffer. ByteBuffer zawiera koncepcję bufora + pozycji i pozwala na odczyt i zapis z indeksowanej pozycji, którą aktualizuje w miarę postępu.

+6

Dokładnie. Nie zmuszaj Javy, aby robiła to po swojemu, zrób to w Javie. Java nie jest C. Próby sprawienia, aby działał jak C zawsze będą brzydkimi hackami. –

6

Można zaprojektować nową klasę tak:

public class Inte{ 
     public int x=0; 
} 

później można utworzyć obiekt tej klasy:

Inte inte=new Inte(); 

potem można przekazać inte jako argumentu w którym chcesz przekazać zmienną całkowitą :

public void function(Inte inte) { 
some code 
} 

więc do aktualizacji wartość całkowita:

inte.x=value; 

dla wartości uzyskiwanie:

Variable=inte.x; 
7

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

2

Można utworzyć klasę Reference zawinąć prymitywów:

public class Ref<T> 
{ 
    public T Value; 

    public Ref(T value) 
    { 
     Value = value; 
    } 
} 

Następnie można tworzyć funkcje, które mają referencji jako parametrów:

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; 
    } 
} 

Zastosowanie:

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.

Powiązane problemy