Java:参照によってintを渡すための最良の方法


84

バイトバッファからエンコードされた長さを解析する解析関数があり、解析された長さをintとして返し、インデックスを整数argとしてバッファに取り込みます。関数が解析対象に応じてインデックスを更新するようにしたい、つまり、参照によってそのインデックスを渡したい。Cでは、を渡すだけint *です。Javaでこれを行う最もクリーンな方法は何ですか?私は現在、インデックス引数を渡すことを検討しています。としてint[]、しかしそれは少し醜いです。


13
Integer不変です。
のYuvalアダム

1
apacheライブラリを避けたい場合は、intを渡して、更新された値を返すことができます。2つの値の場合は、Pointをコンテナとして使用することをお勧めします。それ以外の場合は、配列オプションまたはここでの他の提案の1つで問題ありません。
EntangledLoops

intまたはオブジェクトを返す必要があります。本当に複数が必要な場合は、「クラス」の設計を再考する必要があります
Ujjwal Singh

回答:


72

org.apache.commons.lang.mutable.MutableIntApacheCommonsライブラリから使用してみることができます。言語自体でこれを行う直接的な方法はありません。


24

これはJavaでは不可能です。あなたが提案したように、1つの方法はを渡すことint[]です。もう1つは、たとえばIntHolderをラップした小さなクラスがあることですint


20

Javaでは参照によって引数を渡すことはできません。

できることは、整数値を可変オブジェクトでラップすることです。ApacheCommonsを使用MutableIntすることは良いオプションです。もう1つの、もう少し難読化された方法は、int[]提案したようなものを使用することです。をint単一セルの配列でラップしている理由が不明なため、使用しません。

それjava.lang.Integerは不変であることに注意してください。


AtomicIntegerの使用法はどうですか?これは変更可能であり、参照を介して渡されますか?(Afaik AtomicReference <Boolean>はこれを正しく行います)。
icbytes 2014年


14

バイトバッファとインデックスをByteBufferオブジェクトにラップします。ByteBufferは、buffer + positionの概念をカプセル化し、インデックス付けされた位置からの読み取りと書き込みを可能にします。これは、進むにつれて更新されます。


6
丁度。Javaに自分のやり方でやらせるのではなく、Javaのやり方でやる。JavaはCではありません。JavaをCのように動作させる試みは、常に醜いハックになります。
スキップヘッド

9

次のように新しいクラスを設計できます。

public class Inte{
       public int x=0;
}

後でこのクラスのオブジェクトを作成できます:

Inte inte=new Inte();

次にinte、整数変数を渡したい場所に引数として渡すことができます。

public void function(Inte inte) {
some code
}

したがって、整数値を更新するには、次のようにします。

inte.x=value;

価値を得るために:

Variable=inte.x;

8

プリミティブをラップするための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

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.