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.

Author: Phil Ross, 2010-07-24

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.

 70
Author: doublep,
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.

 19
Author: mikej,
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.

 13
Author: Yuval Adam,
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.

 13
Author: John Kugelman,
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.

 9
Author: user3070377,
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;
 7
Author: Anoos Sb,
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.
 4
Author: Mickael Bergeron Néron,
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