2010-07-24 13 views
67

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

+11

'Entero 'es inmutable. –

+0

Si desea evitar la biblioteca apache, puede pasar el int y devolver el valor actualizado. Si se trata de 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

+0

Debería devolver un int o un objeto; Si realmente necesita más de uno, tal vez debería reconsiderar su diseño de 'clases' –

Respuesta

67

Puede intentar usar org.apache.commons.lang.mutable.MutableInt de la biblioteca Apache Commons. No hay una forma directa de hacer esto en el lenguaje mismo.

13

No puede pasar argumentos por referencia en Java.

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

Tenga en cuenta que java.lang.Integer es inmutable.

+0

¿Qué pasa con el uso de AtomicInteger? ¿Es esto mutable y pasado por referencia? (Afaik AtomicReference hace esto correctamente). – icbytes

+1

Sí icbytes. AtomicInteger es una buena opción. – Prasath

19

Esto no es posible en Java. Como ha sugerido, una forma es aprobar int[]. Otro sería tener una pequeña clase, por ej. IntHolder que envolvió un int.

13

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

+6

Exactamente. No obligue a Java a hacerlo a su manera, hágalo de la manera Java. Java no es C. Los intentos de hacerlo actuar como C siempre serán feos piratas informáticos. –

6

Usted puede diseñar nueva clase como esta:

public class Inte{ 
     public int x=0; 
} 

Más tarde se puede crear el objeto de esta clase:

Inte inte=new Inte(); 

entonces puede pasar inte como argumento en el que desea pasar una variable entera :

public void function(Inte inte) { 
some code 
} 

por lo que para la actualización del valor entero:

inte.x=value; 

para obtener el valor:

Variable=inte.x; 
7

Usted puede utilizar java.util.concurrent.atomic.AtomicInteger.

2

Puede crear una clase de referencia para envolver primitivas:

public class Ref<T> 
{ 
    public T Value; 

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

continuación, puede crear funciones que toman un referente como parámetros:

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.

Cuestiones relacionadas