1

次のメソッドの作成を検討しています。

public static MyBigCollection doSomeStuff(MyBigCollection m) { ... return m; }

次に、別のメソッド(おそらく別のクラス)で、次のように使用します。

MyBigCollection mbc = new MyBigCollection();
mbc = stuffClass.doSomeStuff(mbc);

私はこれを正しい方法で行っていますか?これはオブジェクトに対して「何かを行う」ための効率的な方法ですか?拡張性のために、そのようなものを分割したいと思います。私は長い間c#をやっていますが、Javaについてはよくわかりません。C#では、メソッドはvoidを返す可能性があり、doSomeStuff(mbc)を呼び出すだけで済みます。これにより、オブジェクトが参照によって効果的に渡され、オブジェクトに対していくつかの処理が実行されます。私はJavaの動作が異なることを読んでいるので、ここで専門家に確認したいと思いました。

4

4 に答える 4

2

私はリファクタリングします:

stuffClass.doSomeStuff(mbc);

(つまり、mbcを変更してvoidを返すメソッド)

すべてのJavaオブジェクトはヒープメモリに格納され、参照ポインタとともに渡されることに注意してください。

于 2012-10-25T01:47:21.117 に答える
2

それを行う方法は問題ありませんがreturn、メソッドの最後にあるオブジェクトを実際に処理する必要はありません。そのため、次の方が簡単です...

MyBigCollection mbc = new MyBigCollection();
stuffClass.doSomeStuff(mbc);

Javaのオブジェクトは参照によって渡されるため、メソッドmbc内のオブジェクトに対する変更は、メソッド呼び出しの終了後も変数にdoSomeStuff()保持されます。mbc

returnオブジェクトの使用を検討する唯一の理由mbcは、このような複数のメソッドを結合する機能が必要な場合です...

MyBigCollection mbc = new MyBigCollection();
mbc.doStuff1().doStuff2().doStuff3();

この場合、mbcは各メソッドによって返されるためdoStuff()、次のメソッドを同じオブジェクトに直接呼び出すことができます。参照を行わずreturnに、代わりにこのようなことをする必要があります...

MyBigCollection mbc = new MyBigCollection();
mbc.doStuff1();
mbc.doStuff2();
mbc.doStuff3();

これは同じことですが、それほどコンパクトではありません。それをどのように行うかは、メソッドとオブジェクト自体をどのように使用するかによって異なります。

于 2012-10-25T01:47:32.330 に答える
2

Javaオブジェクトを渡す方法は1つだけです。Javaはすべてを値で渡します。オブジェクトは渡されません。彼らはヒープ上に住んでいます。オブジェクトではなく、参照を渡します。

私の知る限り、C#と同じです。

この種のマイクロ最適化は通常無意味です。

于 2012-10-25T02:03:58.770 に答える
1

あなたの質問は、Javaがオブジェクトへの参照をどのように渡すかについてだと思います。Javaは値を渡しますが、これは最初に言ったときに混乱する可能性があります。オブジェクトの場合、これはオブジェクトへの参照の値がメソッドに渡されることを意味します。値によって参照されるオブジェクトと対話すると、渡されたオブジェクトが変更されるため、オブジェクトを返す必要はありません。

文字列は不変であるため、処理が異なります。プリミティブも値によって渡されますが、渡される値は参照ではないため、元の変数を変更することはありません。

これをテストする最も簡単な方法は、コードを記述して観察することです(Javaチュートリアルも検討してください)。

于 2012-10-25T01:51:17.607 に答える