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
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
.
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.
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.
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.
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.
You can use java.util.concurrent.atomic.AtomicInteger
.