Java: najlepszy sposób na podanie int przez odniesienie
Mam funkcję parsującą, która parsuje zakodowaną długość z bufora bajtowego, zwraca przetwarzaną długość jako int, A Indeks pobiera do bufora jako całkowitą arg. Chcę, aby funkcja zaktualizowała indeks zgodnie z tym, co jest przetwarzane, tzn. chce przekazać ten indeks przez odniesienie. W C po prostu zdałbym int *
.
Jaki jest najczystszy sposób na to w Javie?
Obecnie patrzę na przechodzenie indeks arg. jako int[]
, ale jest trochę brzydki.
7 answers
Możesz spróbować użyć org.apache.commons.lang.mutable.MutableInt
z biblioteki Apache Commons. Nie ma bezpośredniego sposobu na zrobienie tego w samym języku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 17:35:22
To nie jest możliwe w Javie. Jak już zasugerowałeś, jednym ze sposobów jest przejście int[]
. Innym byłoby mieć małą klasę np. IntHolder
, która owija int
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 17:37:19
Nie można przekazywać argumentów za pomocą referencji w Javie.
Możesz zawinąć swoją wartość całkowitą w zmienny obiekt. Używanie Apache Commons ' MutableInt
jest dobrym rozwiązaniem. Innym, nieco bardziej zaciemnionym sposobem jest użycie int[]
, tak jak sugerowałeś. Nie użyłbym go, ponieważ nie jest jasne, dlaczego owijasz int
w jednokomórkową tablicę.
Zauważ, że {[3] } jest niezmienna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 17:36:10
Zawiń bufor bajtów i indeks w obiekt ByteBuffer . Bufor bajtowy zawiera koncepcję pozycji bufora + i umożliwia odczyt i zapis z pozycji indeksowanej, którą aktualizuje w miarę postępów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 17:38:04
Możesz użyć java.util.concurrent.atomic.AtomicInteger
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 04:41:27
Możesz zaprojektować nową klasę w ten sposób:
public class Inte{
public int x=0;
}
Później można utworzyć obiekt tej klasy:
Inte inte=new Inte();
Następnie możesz przekazać inte
jako argument, w którym chcesz przekazać zmienną całkowitą:
public void function(Inte inte) {
some code
}
Więc dla aktualizacji wartość całkowita:
inte.x=value;
Dla uzyskania wartości:
Variable=inte.x;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 19:28:11
Możesz utworzyć klasę odniesienia do zawijania prymitywów:
public class Ref<T>
{
public T Value;
public Ref(T value)
{
Value = value;
}
}
Następnie można 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;
}
}
Użycie:
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.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 16:03:45