Java: Der beste Weg, um int als Referenz zu übergeben

83

Ich habe eine Analysefunktion, die eine codierte Länge aus einem Bytepuffer analysiert, die analysierte Länge als int zurückgibt und einen Index als ganzzahliges Argument in den Puffer aufnimmt. Ich möchte, dass die Funktion den Index entsprechend der Analyse aktualisiert, dh diesen Index als Referenz übergeben möchte. In C würde ich einfach eine passieren int *. Was ist der sauberste Weg, dies in Java zu tun? Ich bin gerade dabei, das Indexargument zu übergeben. als int[], aber es ist ein bisschen hässlich.

Fred Basset
quelle
13
Integerist unveränderlich.
Yuval Adam
1
Wenn Sie die Apache-Bibliothek vermeiden möchten, können Sie das int übergeben und den aktualisierten Wert zurückgeben. Wenn es zwei Werte sind, empfehle ich, Point als Container zu verwenden. Andernfalls ist die Array-Option oder einer der anderen Vorschläge hier in Ordnung.
EntangledLoops
Sie sollten ein int oder ein Objekt zurückgeben. Wenn Sie wirklich mehr als eine brauchen, sollten Sie vielleicht Ihr '
Klassen'

Antworten:

72

Sie können versuchen, org.apache.commons.lang.mutable.MutableIntaus der Apache Commons-Bibliothek zu verwenden. Es gibt keinen direkten Weg, dies in der Sprache selbst zu tun.

doublep
quelle
23

Dies ist in Java nicht möglich. Wie Sie vorgeschlagen haben, besteht eine Möglichkeit darin, eine zu bestehen int[]. Eine andere Möglichkeit wäre, ein wenig Klasse zB do haben , IntHolderdass ein eingewickelt int.

mikej
quelle
20

Sie können in Java keine Argumente als Referenz übergeben.

Sie können Ihren ganzzahligen Wert in ein veränderbares Objekt einschließen. Die Verwendung von Apache Commons MutableIntist eine gute Option. Eine andere, etwas verschleiertere Methode ist die Verwendung einer von int[]Ihnen vorgeschlagenen Methode . Ich würde es nicht verwenden, da unklar ist, warum Sie ein intArray in ein einzelliges Array einwickeln .

Beachten Sie, dass dies java.lang.Integerunveränderlich ist.

Yuval Adam
quelle
Was ist mit der Verwendung von AtomicInteger? Ist das veränderlich und wird als Referenz weitergegeben? (Afaik AtomicReference <Boolean> macht das richtig).
icbytes
16

Sie können verwenden java.util.concurrent.atomic.AtomicInteger.

user3070377
quelle
13

Wickeln Sie den Bytepuffer und den Index in ein ByteBuffer- Objekt. Ein ByteBuffer kapselt das Konzept einer Puffer + Position und ermöglicht Ihnen das Lesen und Schreiben von der indizierten Position, die er im Laufe der Zeit aktualisiert.

John Kugelman
quelle
6
Genau. Erzwinge Java nicht, es auf deine Weise zu tun, sondern auf die Java-Art. Java ist nicht C. Versuche, es so zu machen, wie C, wird immer hässliche Hacks sein.
Skip Head
9

Sie können eine neue Klasse wie folgt entwerfen:

public class Inte{
       public int x=0;
}

später können Sie ein Objekt dieser Klasse erstellen:

Inte inte=new Inte();

Dann können Sie inteals Argument übergeben, wo Sie eine Ganzzahlvariable übergeben möchten:

public void function(Inte inte) {
some code
}

Also für die Aktualisierung des Integer-Werts:

inte.x=value;

um Wert zu bekommen:

Variable=inte.x;
Anoos Sb
quelle
6

Sie können eine Referenzklasse erstellen, um Grundelemente zu verpacken:

public class Ref<T>
{
    public T Value;

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

Anschließend können Sie Funktionen erstellen, die eine Referenz als Parameter verwenden:

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

Verwendung:

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

Hoffe das hilft.

Mickael Bergeron Néron
quelle