J'ai une fonction d'analyse syntaxique qui analyse une longueur encodée à partir d'un tampon d'octets, elle retourne la longueur analysée sous la forme d'un entier et prend un index dans la mémoire tampon sous la forme d'un argument entier. Je souhaite que la fonction mette à jour l’index en fonction de son analyse, c’est-à-dire que je souhaite le transmettre par référence. En C, je viens de passer un int *
. Quel est le moyen le plus propre de le faire en Java? Je cherche actuellement à passer l'argument d'index. comme un int[]
, mais c'est un peu moche.
Vous pouvez essayer d'utiliser org.Apache.commons.lang.mutable.MutableInt
de la bibliothèque Apache Commons. Il n'y a pas de moyen direct de faire cela dans la langue elle-même.
Ce n'est pas possible en Java. Comme vous l'avez suggéré, l'un des moyens consiste à passer un int[]
. Un autre serait d'avoir une petite classe, par exemple IntHolder
qui a enveloppé un int
.
Vous ne pouvez pas transmettre d'arguments par référence en Java.
Ce que vous pouvez faire, c'est envelopper votre valeur entière dans un objet mutable. L'utilisation de MutableInt
d'Apache Commons est une bonne option. Une autre manière légèrement plus obscure consiste à utiliser un int[]
comme vous l'avez suggéré. Je ne l'emploierais pas car il est difficile de comprendre pourquoi vous enregistrez un int
dans un tableau à une seule cellule.
Notez que Java.lang.Integer
est immuable.
Enveloppez le tampon d'octet et l'index dans un objet ByteBuffer . Un ByteBuffer encapsule le concept de tampon + position et vous permet de lire et d'écrire à partir de la position indexée, qu'il met à jour au fur et à mesure.
Vous pouvez utiliser Java.util.concurrent.atomic.AtomicInteger
.
Vous pouvez concevoir une nouvelle classe comme ceci:
public class Inte{
public int x=0;
}
plus tard, vous pouvez créer un objet de cette classe:
Inte inte=new Inte();
alors vous pouvez passer inte
en tant qu'argument pour lequel vous souhaitez passer une variable entière:
public void function(Inte inte) {
some code
}
donc pour mettre à jour la valeur entière:
inte.x=value;
pour obtenir de la valeur:
Variable=inte.x;
Vous pouvez créer une classe de référence pour envelopper les primitives:
public class Ref<T>
{
public T Value;
public Ref(T value)
{
Value = value;
}
}
Ensuite, vous pouvez créer des fonctions qui prennent une référence en tant que paramètres:
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
J'espère que cela t'aides.