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.


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.


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.


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.


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


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.


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;

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.