1

与えられた: クラスにはフィールドがなく、すべての変数はローカルです。littleString は、Eclipse で bigString をリファクタリングすることによって作成されました。

public String bigString()
    {
        StringBuffer bob = new StringBuffer();
        this.littleString(bob);
        return bob.toString();
    }

private void littleString(final StringBuffer bob)
    {
        bob.append("Hello, I'm Bob");
    }

メソッド littleString は StringBuffer を返すべきではありませんが、まだそうです。ここではどのような黒魔術が行われていますか? これは、私が知っているカプセル化のすべてのルールを破っています。ショックです、言葉が出ません。

4

4 に答える 4

7

littleStringオブジェクトを返していません。同じオブジェクトを使用しているだけです。ローカル変数bobinbigString()とパラメーターbobinはどちらもlittleString()同じオブジェクトを参照しているため、これらのオブジェクトのいずれかを変更すると、両方とも同じオブジェクトへの参照であるため、変更が他のオブジェクトに即座に反映されます。

問題は、StringBufferが変更可能であり、内部状態が関連付けられていることです。一部のタイプのオブジェクト ( Strings など) は不変であるため、それらをメソッド パラメーターとして安全に渡すことができ、変更されることはありません。finalキーワードを追加しても、ここでは役に立たないことに注意してください。別のオブジェクトbobを参照するために が割り当てられないようにするだけです。StringBuffer

于 2009-02-12T02:29:44.360 に答える
1

何も返していません。参照を渡した StringBuffer を変更しています。Java のオブジェクトは値渡しされません。

于 2009-02-12T02:31:15.870 に答える
1

文字列バッファーが変更される理由を意味している場合は、文字列バッファーへの参照を渡しているためです。これにより、文字列バッファー オブジェクトを変更するパブリック メソッド append を呼び出すことができます。

于 2009-02-12T02:32:11.530 に答える
0

上記の答えは、ほとんど言及されていないことを除いて、ほとんどそれを得ました.Javaには「const-ness」がありません。つまり、オブジェクトを変更できないようにする必要があります。

「最終」は近いですが、それでも適切に機能しません。コード スニペットが示したのは、変更可能なオブジェクトがパラメーターとして他のメソッドに渡された場合に発生する可能性がある種類のエラーです。これは、不変オブジェクトを使用するか、または深い const-ness のために何らかの新しいキーワードが追加されている場合に修正できます。

于 2009-02-12T09:56:03.023 に答える