Javaではプリミティブ型への参照(四角で囲まれたままにプリミティブデータを強制する方法)

URI:

私はそれを変更することができる方法にプリミティブ型への参照を渡したいです。

次のサンプルを考えてみます。

public class Main {

    Integer x = new Integer(42);
    Integer y = new Integer(42);

    public static void main(String[] args) {
        Main main = new Main();
        System.out.println("x Before increment: " + main.x);

        // based on some logic, call increment either on x or y
        increment(main.x);

        System.out.println("x after increment: " + main.x);
    }

    private static void increment(Integer int_ref) {
        ++int_ref;
    }
}

サンプルを実行している出力は、次のとおりです。

x Before increment: 42
x after increment: 42

これは私の楽観的な名前にもかかわらず、値ではなく、参照することによって機能に過ぎだったint_ref手段。

もちろん、そこにこの特定の例を回避する方法がありますが、私の実際のアプリケーションでは道、より複雑で、一般的なものでは整数への「ポインタ」または参照は多くのシナリオで有用であろうことを想像します。

私は運で、機能(その後、intにキャスト)、および様々な他の方法にオブジェクトを渡すためにしようとしました。動作しているようだ回避策の一つは、Integerクラスの私の独自のバージョンを定義するには、次のようになります。

private static class IntegerWrapper {
    private int value;

    IntegerWrapper(int value) { this.value = value; }
    void plusplus() { ++value; }
    int getValue() { return value; }
}

これを行うと、IntegerWrapperへの参照を渡すと、期待通りに機能しますが、私の好みにそれは非常にラメようです。箱入り変数はちょうど箱入りのままC#、から来て、私はちょうどミス何かを願っています。

EDIT:

私は私の質問が重複のない主張されているJava「により、参照渡し」または「値渡し」?私の質問は、理論的ではないように、と私は単純に解決策を求めています。哲学的に、すべての言語のすべてのメソッド呼び出しは、パスごとの値である:彼らはいずれかの実際の値、または値への参照を渡す-値によって。

だから、私は私の質問を言い換えます:Javaで私は整数への参照を渡すことができないんだという問題を回避するための一般的なパラダイムとは何ですか。IntegerWrapperは、既知のパラダイムの上に示唆していますか?同様のクラス(多分MutableInt)は、既にライブラリに存在していますか?たぶん、長さ1の配列、共通の練習や、いくつかのパフォーマンス上の利点を持っていますか?私は彼が任意の種類のオブジェクトへの参照を格納することができ、実際に悩まさ人だけが、基本的なタイプのですか?

oleg.cherednik:

Integer あなたが気づくこととして、不変です。

あなたのアプローチがprivate static class IntegerWrapper正しいものです。サイズ1を持つ配列を使用することも正しいのですが、実際には、私はこのような場合のために、配列を使用して見たことがありません。だから、使用を行いますIntegerWrapper.

まったく同じ実装では、Apacheで見つけることができますorg.apache.commons.lang3.mutable.MutableInt

あなたの例では、あなたはまた、提供することができますMain静的メソッドにインスタンスを:

public class Main {

    private int x = 42;

    public static void main(String[] args) {
        Main main = new Main();
        incrementX(main);
    }

    private static void incrementX(Main main) {
        main.x++;
    }
}

そして最後に、Java8からあなたが定義することができinc機能をインクリメント値にそれを使用します。

public class Main {

    private static final IntFunction<Integer> INC = val -> val + 1;

    private int x = 42;

    public static void main(String[] args) {
        Main main = new Main();
        main.x = INC.apply(main.x);
    }

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=179027&siteId=1