2010-07-24 18 views
67

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

+11

"Integer" è immutabile. –

+0

Se si desidera evitare la libreria apache, è possibile passare int e restituire il valore aggiornato. Se si tratta di due valori, ti consiglio di utilizzare Point come contenitore. Altrimenti, l'opzione dell'array o uno degli altri suggerimenti qui va bene. – EntangledLoops

+0

Si dovrebbe restituire un int o un oggetto; Se hai davvero bisogno di più di una, forse dovresti riconsiderare il tuo design delle 'classi' –

risposta

67

Puoi provare a utilizzare org.apache.commons.lang.mutable.MutableInt dalla libreria Apache Commons. Non esiste un modo diretto per farlo nel linguaggio stesso.

13

Non è possibile passare argomenti per riferimento in Java.

Quello che puoi fare è racchiudere il valore intero in un oggetto mutabile. L'utilizzo di Apache Commons 'MutableInt è una buona opzione. Un altro modo, leggermente più offuscato, è usare uno int[] come suggerito. Non lo userei in quanto non è chiaro il motivo per cui si sta confezionando uno int in un array a cella singola.

Si noti che java.lang.Integer è immutabile.

+0

E l'utilizzo di AtomicInteger? È mutabile e passato tramite riferimento? (Afaik AtomicReference lo fa correttamente). – icbytes

+1

Sì icbytes. AtomicInteger è una buona opzione. – Prasath

19

Questo non è possibile in Java. Come hai suggerito, un modo è passare un int[]. Un altro sarebbe avere una piccola classe, ad es. IntHolder che ha avvolto un int.

13

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

+6

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

6

È possibile progettare la nuova classe come questa:

public class Inte{ 
     public int x=0; 
} 

poi si può creare l'oggetto di questa classe:

Inte inte=new Inte(); 

allora si può passare inte come argomento in cui si desidera passare una variabile intera :

public void function(Inte inte) { 
some code 
} 

quindi per aggiornare il valore intero:

inte.x=value; 

per il valore ottenere:

Variable=inte.x; 
7

È possibile utilizzare java.util.concurrent.atomic.AtomicInteger.

2

È possibile creare una classe di riferimento per avvolgere primitive:

public class Ref<T> 
{ 
    public T Value; 

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

Quindi è possibile creare funzioni che accettano 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; 
    } 
} 

Usage:

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 questo ti aiuti.

Problemi correlati