バイトバッファからエンコードされた長さを解析する解析関数があり、解析された長さをintとして返し、インデックスを整数argとしてバッファに取り込みます。関数が解析対象に応じてインデックスを更新するようにしたい、つまり、参照によってそのインデックスを渡したい。Cでは、を渡すだけint *
です。Javaでこれを行う最もクリーンな方法は何ですか?私は現在、インデックス引数を渡すことを検討しています。としてint[]
、しかしそれは少し醜いです。
バイトバッファからエンコードされた長さを解析する解析関数があり、解析された長さをintとして返し、インデックスを整数argとしてバッファに取り込みます。関数が解析対象に応じてインデックスを更新するようにしたい、つまり、参照によってそのインデックスを渡したい。Cでは、を渡すだけint *
です。Javaでこれを行う最もクリーンな方法は何ですか?私は現在、インデックス引数を渡すことを検討しています。としてint[]
、しかしそれは少し醜いです。
回答:
Javaでは参照によって引数を渡すことはできません。
できることは、整数値を可変オブジェクトでラップすることです。ApacheCommonsを使用MutableInt
することは良いオプションです。もう1つの、もう少し難読化された方法は、int[]
提案したようなものを使用することです。をint
単一セルの配列でラップしている理由が不明なため、使用しません。
それjava.lang.Integer
は不変であることに注意してください。
を使用できますjava.util.concurrent.atomic.AtomicInteger
。
バイトバッファとインデックスをByteBufferオブジェクトにラップします。ByteBufferは、buffer + positionの概念をカプセル化し、インデックス付けされた位置からの読み取りと書き込みを可能にします。これは、進むにつれて更新されます。
プリミティブをラップするためのReferenceクラスを作成できます。
public class Ref<T>
{
public T Value;
public Ref(T value)
{
Value = value;
}
}
次に、参照をパラメーターとして受け取る関数を作成できます。
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;
}
}
使用法:
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
お役に立てれば。
Integer
不変です。