Java: la mejor manera de pasar int por referencia

84

Tengo una función de análisis que analiza una longitud codificada de un búfer de bytes, devuelve la longitud analizada como un int y toma un índice en el búfer como un argumento entero. Quiero que la función actualice el índice de acuerdo con lo que se analiza, es decir, quiero pasar ese índice por referencia. En C simplemente pasaría un int *. ¿Cuál es la forma más limpia de hacer esto en Java? Actualmente estoy buscando pasar el índice arg. como un int[], pero es un poco feo.

Fred Basset
fuente
13
Integeres inmutable.
Yuval Adam
1
Si desea evitar la biblioteca de apache, puede pasar el int y devolver el valor actualizado. Si son dos valores, recomiendo usar Point como contenedor. De lo contrario, la opción de matriz o una de las otras sugerencias aquí está bien.
EntangledLoops
Debería devolver un int o un objeto; Si realmente necesita más de uno, tal vez debería reconsiderar el diseño de sus 'clases'
Ujjwal Singh

Respuestas:

72

Puede intentar usarlo org.apache.commons.lang.mutable.MutableIntdesde la biblioteca Apache Commons. No hay una forma directa de hacer esto en el propio idioma.

doble
fuente
24

Esto no es posible en Java. Como ha sugerido, una forma es pasar un int[]. Otro sería tener una pequeña clase, por ejemplo, IntHolderque envuelva un int.

mikej
fuente
20

No puede pasar argumentos por referencia en Java.

Lo que puede hacer es envolver su valor entero en un objeto mutable. Usar Apache Commons ' MutableIntes una buena opción. Otra forma, un poco más ofuscada, es usar una int[]como sugirió. No lo usaría ya que no está claro por qué está envolviendo un inten una matriz unicelular.

Tenga en cuenta que java.lang.Integeres inmutable.

Yuval Adam
fuente
¿Qué pasa con el uso de AtomicInteger? ¿Es esto mutable y pasa por referencia? (Afaik AtomicReference <Boolean> hace esto correctamente).
icbytes
18

Puede utilizar java.util.concurrent.atomic.AtomicInteger.

user3070377
fuente
14

Envuelva el búfer de bytes y el índice en un objeto ByteBuffer . Un ByteBuffer encapsula el concepto de búfer + posición y le permite leer y escribir desde la posición indexada, que actualiza a medida que avanza.

John Kugelman
fuente
6
Exactamente. No obligue a Java a hacerlo a su manera, hágalo a la manera de Java. Java no es C. Los intentos de hacerlo actuar como C siempre serán trucos desagradables.
Skip Head
9

Puedes diseñar una nueva clase como esta:

public class Inte{
       public int x=0;
}

luego puedes crear un objeto de esta clase:

Inte inte=new Inte();

luego puede pasar intecomo argumento donde desea pasar una variable entera:

public void function(Inte inte) {
some code
}

así que para actualizar el valor entero:

inte.x=value;

por obtener valor:

Variable=inte.x;
Anoos Sb
fuente
8

Puede crear una clase de referencia para envolver primitivas:

public class Ref<T>
{
    public T Value;

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

Luego puede crear funciones que tomen una referencia como parámetro:

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

Uso:

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

Espero que esto ayude.

Mickael Bergeron Néron
fuente