2011-09-12 11 views
1

アクセサ/ミューテータとシャロー/ディープコピーについては、どのようなベストプラクティスと考えられますか?または、この問題は現在の状況に特有のものですか?アクセサ/ミューテータのシャロー/ディープコピーのセマンティクス

すなわち

public class Test { 
    private final Point point = new Point(-32, 168); 
    public void getPoint{ 
     return point 
    } 
} 

私の現在の考え方が変更可能な何のための深いコピーを使用することです。したがって、Pointがセッターを提供した場合、私はTest#getPointでディープコピーを使用します。

現状は何ですか?

[編集]

JB Nizetの答えの後には、私はthis素晴らしいリソースを発見しました。

+0

現在の考え方は、参照の代わりに完全に区切られたオブジェクトが必要な場合にのみ使用します。 – peko

答えて

2

によって異なります。場合によっては、オブジェクトへの参照を返し、呼び出し元にそれを変更させたい場合もあります。場合によってはコピーを返すことがあります。ポイントの場合、コピーはより適切だと思われます。

クラスの状態を保護する別の方法は、フィールドの変更不可能なビューを返すことです。これは、戻り値の型を読み取り専用メソッドを提供するインタフェースとして宣言するか、またはJavaコレクションapiのように、オブジェクトと同じインタフェースを提供するラッパーオブジェクトを返すが、ミューテータメソッドが呼び出されたときには例外をスローすることによって行うことができる。

あなたが選んだ解決策が何であれ、キーはあなたの方法が何であるかを記録することです。

+0

+1ほとんどのポイントに同意しながら、オブジェクトの参照(内部状態)を渡します。それはカプセル化を破るので、発信者は決して良いアイホーではありません。 – helpermethod

+0

@Oliver Weiler - 発信者に渡す参照タイプのコピーを作成することをお勧めしますか? – wulfgarpro

+0

@Oliver Weiler。シングルトンを返すファクトリオブジェクトがある場合は、シングルトンリファレンスを返す必要があります。すべてのオブジェクトは状態を持たず、一部のオブジェクトは状態を持ちますが、不変(String、Integerなど)であり、一部のステートフルな変更可能オブジェクトは共有されるものです(Thread、Future、OutputStream)。 –

関連する問題