Java: melhor maneira de passar int por referência

84

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.

basset fred
fonte
13
Integeré imutável.
Yuval Adam
1
Se você quiser evitar a biblioteca apache, pode passar o int e retornar o valor atualizado. Se forem dois valores, recomendo usar Point como um contêiner. Caso contrário, a opção de matriz ou uma das outras sugestões aqui está bem.
EntangledLoops de
Você deve retornar um int ou um objeto; Se você realmente precisa de mais de um, talvez deva repensar o design de suas 'classes'
Ujjwal Singh

Respostas:

72

Você pode tentar usar a org.apache.commons.lang.mutable.MutableIntpartir da biblioteca Apache Commons. Não há uma maneira direta de fazer isso na própria linguagem.

doublep
fonte
24

Isso não é possível em Java. Como você sugeriu, uma maneira é passar um int[]. Outro seria ter um pouco de classe, por exemplo, IntHolderque envolveu um int.

Mikej
fonte
20

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 um int[]como você sugeriu. Eu não usaria, pois não está claro por que você está envolvendo um intem uma matriz unicelular.

Observe que java.lang.Integeré imutável.

Yuval Adam
fonte
E quanto ao uso do AtomicInteger? Isso é mutável e passado por referência? (Afaik AtomicReference <Boolean> faz isso corretamente).
icbytes
18

Você pode usar java.util.concurrent.atomic.AtomicInteger.

user3070377
fonte
14

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.

John Kugelman
fonte
6
Exatamente. Não force o Java a fazer do seu jeito, faça do jeito Java. Java não é C. As tentativas de fazê-lo agir como C sempre serão hacks feios.
Skip Head
9

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 intecomo argumento onde deseja passar uma variável inteira:

public void function(Inte inte) {
some code
}

então, para atualizar o valor inteiro:

inte.x=value;

para obter valor:

Variable=inte.x;
Anoos Sb
fonte
8

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.

Mickael Bergeron Néron
fonte