web-dev-qa-db-fra.com

Java: Le meilleur moyen de passer int par référence

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.

78
fred basset

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.

71
doublep

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.

20
mikej

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.

16
Yuval Adam

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.

13
John Kugelman

Vous pouvez utiliser Java.util.concurrent.atomic.AtomicInteger.

12
user3070377

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;
8
Anoos Sb

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.

5