Eu tenho uma função de análise que analisa um comprimento codificado de um buffer de bytes, retorna o comprimento analisado como um int e leva um índice para o buffer como um argumento inteiro. Quero que a função atualize o índice de acordo com o que é analisado, ou seja, quero passar esse índice por referência. Em C, eu apenas aprovaria um int *
. Qual é a maneira mais limpa de fazer isso em Java? No momento, estou tentando passar o índice arg. como um int[]
, mas é um pouco feio.
java
pass-by-reference
basset fred
fonte
fonte
Integer
é imutável.Respostas:
Você pode tentar usar a
org.apache.commons.lang.mutable.MutableInt
partir da biblioteca Apache Commons. Não há uma maneira direta de fazer isso na própria linguagem.fonte
Isso não é possível em Java. Como você sugeriu, uma maneira é passar um
int[]
. Outro seria ter um pouco de classe, por exemplo,IntHolder
que envolveu umint
.fonte
Você não pode passar argumentos por referência em Java.
O que você pode fazer é envolver seu valor inteiro em um objeto mutável. Usar o Apache Commons '
MutableInt
é uma boa opção. Outra maneira, um pouco mais ofuscada, é usar umint[]
como você sugeriu. Eu não usaria, pois não está claro por que você está envolvendo umint
em uma matriz unicelular.Observe que
java.lang.Integer
é imutável.fonte
Você pode usar
java.util.concurrent.atomic.AtomicInteger
.fonte
Envolva o buffer de bytes e o índice em um objeto ByteBuffer . Um ByteBuffer encapsula o conceito de buffer + posição e permite que você leia e escreva a partir da posição indexada, que é atualizada conforme você avança.
fonte
Você pode criar uma nova classe como esta:
public class Inte{ public int x=0; }
mais tarde você pode criar um objeto desta classe:
Inte inte=new Inte();
então você pode passar
inte
como argumento onde deseja passar uma variável inteira:public void function(Inte inte) { some code }
então, para atualizar o valor inteiro:
para obter valor:
fonte
Você pode criar uma classe de referência para envolver primitivos:
public class Ref<T> { public T Value; public Ref(T value) { Value = value; } }
Em seguida, você pode criar funções que usam uma referência 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 isto ajude.
fonte