2012-01-26 17 views
5

次のコードでは、updateWithContexがパラメータとしてとった同じオブジェクトを返すのは本当に悪い習慣ですか? C++でJava Practice:パラメータとして渡された同じオブジェクトを返す

class SomeClass{ 
    Foo updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
     return foo; 
    } 
} 

class Foo{ 

    public void setAppId(int appId) 
    { 
     // 
    } 
    public void setXId(int appId) 
    { 
     // 
    } 
    public void changeState(X x) 
    { 
     // 
    } 
} 

、私はこのようなコードを見てきました:

BigObject& 
    fastTransform(BigObject& myBO) 
    { 
     // When entering fastTransform(), myBO is the same object as the function 
     // argument provided by the user. -> No copy-constructor is executed. 
     // Transform myBO in some way 
     return myBO; // Transformed myBO is returned to the user. 
    } 

はこのも間違っていますか?

+2

メソッド連鎖は少し異なりますが、この場合のようにパラメータとして渡されたオブジェクトではなく、メソッドが呼び出されたオブジェクトへの参照を返します。 – buc

+0

@buc:真実、良い点。私は速すぎました、そして –

答えて

9

オブジェクトを返すと、渡されたオブジェクトは変更されず、代わりに新しい変更されたオブジェクトが返されることが、あなたのabiのユーザに示唆されます。これが当てはまらないことを明確にするために、戻り値の型をvoidに変更することを提案します。

+0

これは理にかなっています!しかしそれは根本的に間違っていますか?それともコードの読みやすさだけですか? – yadab

+2

"根本的に間違って"定義する方法に依存します...このメソッドを使用することは不可能になりますか?あなたの名前を、あなたの方法を呼ばなければならない他の誰かに呪われますか?多分! – vaughandroid

+0

@vaughandroidそれでは、これを処理するより良い方法は何ですか? – user11235813

2

あなたのコードは次のようになります。

class SomeClass{ 
    void updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
    } 
} 

あなたがメソッドを、それをバック戻さずupdateWithContex方法でそれを変更することができるようにあなたは、fooというオブジェクトへの参照を渡すので、それは悪い習慣です。もう一度、Javaを使用して常に参照することを忘れないでください。そして、確かに、他の場所でそれを行う方法はありません - それは常にオブジェクトへの参照になるでしょう。 Javaには、fastTransform(BigObject & myBO)のようなものはありません。

+0

Fwiw、私はupdateWithContextがプライベートであると思います。そして、この程度まで戻り値の型は非常に重要ではありません。 Fooの内部状態を変更するパブリックメソッドがある場合、これらをFooのvoidメンバーとして宣言します。 –

+0

私はJavaのリファレンスがどのように動作するかを知っています。そのため、必要性を明確にするためにC++のリファレンスを提供しています。私の質問は、なぜ同じフーを返すのが間違っているのかです。アセンブリでプログラミングするときに、同じレジストリが変更され、プッシュバックされますが、なぜJavaではどうですか? – yadab

+0

@Savino Sguera - updateWithContextはパッケージプライベートです。 –

2

私は何も間違っているとは限りません。それはAPIデザインの問題です。コードを使用すると、投稿しているあなたは

someClass.updateWithContext(new Foo()).changeState(x); 

代わりの

Foo foo = new Foo(); 
someClass.updateWithContext(foo); 
foo.changeState(x); 

ような何かを行うことができます最初のコードスニペットは、第1よりもfluent interfaceのよりよい例です。

+0

ありがとうございます!しかし、私のケースは、あなたが返答したものとは少し異なります(メソッドチェーンは私の問題ではありません)。 – yadab

1

Output Parameters in Java一部のオブジェクトは不変です。このようなメソッドのスレッドの安全性にも疑問があります。これは実行できますが、それは通常、出力javaパラメータに対しても良いことではなく、Googleとはみなされません。お役に立てれば。

関連する問題