fred basset
fred basset

Reputation: 10072

Java : Best way to pass int by reference

I have a parsing function that parses an encoded length from a byte buffer, it returns the parsed length as an int, and takes an index into the buffer as an integer arg. I want the function to update the index according to what it's parsed, i.e. want to pass that index by reference. In C I'd just pass an int *. What's the cleanest way to do this in Java? I'm currently looking at passing the index arg. as an int[], but it's a bit ugly.

Upvotes: 92

Views: 100074

Answers (7)

You can create a Reference class to wrap primitives:

public class Ref<T>
{
    public T Value;

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

Then you can create functions that take a Reference as a parameters:

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

Hope this helps.

Upvotes: 8

user3070377
user3070377

Reputation: 449

You can use java.util.concurrent.atomic.AtomicInteger.

Upvotes: 19

Anoos Sb
Anoos Sb

Reputation: 453

You can design new class like this:

public class Inte{
       public int x=0;
}

later you can create object of this class :

Inte inte=new Inte();

then you can pass inte as argument where you want to pass an integer variable:

public void function(Inte inte) {
some code
}

so for update the integer value:

inte.x=value;

for getting value:

Variable=inte.x;

Upvotes: 9

John Kugelman
John Kugelman

Reputation: 361564

Wrap the byte buffer and index into a ByteBuffer object. A ByteBuffer encapsulates the concept of a buffer+position and allows you to read and write from the indexed position, which it updates as you go along.

Upvotes: 14

mikej
mikej

Reputation: 66263

This isn't possible in Java. As you've suggested one way is to pass an int[]. Another would be do have a little class e.g. IntHolder that wrapped an int.

Upvotes: 25

Yuval Adam
Yuval Adam

Reputation: 165212

You cannot pass arguments by reference in Java.

What you can do is wrap your integer value in a mutable object. Using Apache Commons' MutableInt is a good option. Another, slightly more obfuscated way, is to use an int[] like you suggested. I wouldn't use it as it is unclear as to why you are wrapping an int in a single-celled array.

Note that java.lang.Integer is immutable.

Upvotes: 20

user319799
user319799

Reputation:

You can try using org.apache.commons.lang.mutable.MutableInt from Apache Commons library. There is no direct way of doing this in the language itself.

Upvotes: 76

Related Questions