5

Javaの2つのクラスの下からの正しいカプセル化は何ですか?.私は多くのコードでこれらの両方のアプローチを見ました(主に最初のアプローチ)。しかし、2番目のアプローチが正しいようです。

import java.util.Date;

public class SomeClass
{
    private Date date;

    public Date getDate()
    {
        return date;
    }

    public void setDate(Date date)
    {
        this.date = date;
    }   
}

また

import java.util.Date;

public class SomeClass
{
    private Date date;

    public Date getDate()
    {
        return (Date) date.clone();
    }

    public void setDate(Date date)
    {
        this.date = (Date) date.clone();
    }

}
4

8 に答える 8

4

次のようにするのは得策ではありませんclone-

  1. 通常clone、オブジェクトのメソッドは、同じクラスの新しいインスタンスを作成し、すべてのフィールドを新しいインスタンスにコピーして返します = 浅いコピー。Objectクラスは clone メソッドを提供し、shallow copy. 「オブジェクト」をタイプとして返​​すためcast back、元のオブジェクトに明示的に指定する必要があります。

  2. ディープコピーを実装するときは、cyclic dependencies.

  3. クローンは と ではありませinstantiationinitialization。新しいオブジェクトを作成するものと見なされるべきではありません。複製されたオブジェクトのコンストラクターがプロセスで呼び出されない可能性があるためです。

4.もう1つの欠点(および他の多くの.. :))、クローンはfinal フィールドの使用を妨げます。

5. シングルトン パターンでは、 がメソッドをsuperclass実装する場合public clone()、サブクラスがこのクラスのclone()メソッドを使用してコピーを取得するのを防ぐために、それを上書きしてスローします。CloneNotSupportedException

したがって、アプローチ 1アプローチ 2よりも優れています。

于 2013-06-20T06:51:25.683 に答える
0

この特定の例ではなく、一般的なアプローチの場合:

返されたオブジェクトを他の互換性のあるクラスにキャストする方法をユーザーに提供することは常に良いことです。

したがって、最初のメソッドは適切に見えます。返されるオブジェクトが他のクラスによって拡張されている場合、固定型オブジェクトを提供するのではなく、その型にキャストする方が簡単だからです。

したがって、このようにして、より一般的なオブジェクトを提供するかabstraction、励ますことができますpolymorphism

于 2013-06-20T06:45:06.903 に答える