Java: il modo migliore per passare int per riferimento


84

Ho una funzione di analisi che analizza una lunghezza codificata da un buffer di byte, restituisce la lunghezza analizzata come int e prende un indice nel buffer come un intero arg. Voglio che la funzione aggiorni l'indice in base a ciò che viene analizzato, cioè voglio passare quell'indice per riferimento. In C mi limiterò a passare un int *. Qual è il modo più pulito per farlo in Java? Attualmente sto cercando di passare l'indice arg. come un int[], ma è un po 'brutto.


13
Integerè immutabile.
Yuval Adam

1
Se vuoi evitare la libreria Apache, puoi passare l'int e restituire il valore aggiornato. Se sono due valori, consiglio di utilizzare Point come contenitore. Altrimenti, l'opzione array o uno degli altri suggerimenti qui va bene.
EntangledLoops

Dovresti restituire un int o un oggetto; Se hai davvero bisogno di più di uno, forse dovresti ripensare al design delle tue "classi"
Ujjwal Singh,

Risposte:


72

Puoi provare a utilizzare org.apache.commons.lang.mutable.MutableIntdalla libreria Apache Commons. Non esiste un modo diretto per farlo nella lingua stessa.


24

Questo non è possibile in Java. Come hai suggerito, un modo è passare un file int[]. Un altro sarebbe avere una piccola classe, ad esempio IntHolderche racchiude un file int.


20

Non è possibile passare argomenti per riferimento in Java.

Quello che puoi fare è racchiudere il tuo valore intero in un oggetto mutabile. Usare Apache Commons ' MutableIntè una buona opzione. Un altro modo, leggermente più offuscato, è quello di utilizzare un int[]come suggerito. Non lo userei perché non è chiaro il motivo per cui stai avvolgendo un intin un array a cella singola.

Nota che java.lang.Integerè immutabile.


E per quanto riguarda l'utilizzo di AtomicInteger? È modificabile e trasmesso tramite riferimento? (Afaik AtomicReference <Boolean> lo fa correttamente).
icbytes


14

Racchiudi il buffer di byte e l'indice in un oggetto ByteBuffer . Un ByteBuffer incapsula il concetto di buffer + posizione e ti consente di leggere e scrivere dalla posizione indicizzata, che aggiorna man mano che procedi.


6
Esattamente. Non forzare Java a fare a modo tuo, fallo in modo Java. Java non è C. I tentativi di farlo agire come C saranno sempre brutti hack.
Skip Head

9

Puoi progettare una nuova classe come questa:

public class Inte{
       public int x=0;
}

successivamente puoi creare oggetti di questa classe:

Inte inte=new Inte();

quindi puoi passare intecome argomento dove vuoi passare una variabile intera:

public void function(Inte inte) {
some code
}

quindi per aggiornare il valore intero:

inte.x=value;

per ottenere valore:

Variable=inte.x;

8

Puoi creare una classe di riferimento per avvolgere le primitive:

public class Ref<T>
{
    public T Value;

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

Quindi puoi creare funzioni che prendono un riferimento come parametri:

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

Utilizzo:

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

Spero che sia di aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.