7

クラスライブラリを開発しています。

  1. 基本的なメソッドのいくつかの実装を提供する、行列の抽象基本クラス Matrix があります。
  2. Matrix から派生するのは、さまざまなタイプの行列の具体的なサブクラスです。
  3. 行列を複製可能にする必要があるため、Matrix は Cloneable インターフェイスを実装します。
  4. Matrix から派生したクラスの一部は不変です

オブジェクトのクローンを返す代わりに、オブジェクト自体が返されることは、不変クラスの clone メソッドに受け入れられるでしょうか?

明確化のためのいくつかの(単純化された)コード:

abstract class Matrix implements Cloneable {
   ...
}

class ImmutableMatrix extends Matrix {
    ImmutableMatrix clone() {
        return this;
    }
    ...
}

class SomeOtherMatrix extends Matrix {
    SomeOtherMatrix clone() {
        SomeOtherMatrix other = super.clone();
        ...
        return other;
    }
    ...
}
4

5 に答える 5

11

super.clone()私は電話で十分だと思っていたでしょう。

クラスが不変の場合、作成時に変更可能なクラスがすでに複製されているはずです。したがって、クラスが持つフィールドの浅いコピーを持つことは安全だと思います。

優先される JavaDocs 状態x.clone() != x。これは絶対的な要件ではありませんが、単に返すという計画に違反することは確かthisです。

于 2012-11-03T09:51:29.330 に答える
4

this不変クラスの clone() 実装に戻るだけです。

于 2012-11-09T16:04:33.607 に答える
4

不変クラスを単に実装してそれ自体への参照を返すようにすることもできますが、不変のものを可変に対処する方法やその逆を行う方法がなければ、可変であるかどうかにかかわらずclone使用する価値はあまりありません。clone

Matrix基本クラスには、 、、およびメソッドとともにメソッドIsImmutableおよびを含める方がよいと思います。また、マトリックスを読み書きするメソッドも含める必要があります (ただし、書き込み不可のマトリックスで「書き込み」メソッドを呼び出すと、例外がスローされます)。IsWritableAsImmutableAsMutableAsNewMutable

を指定すると、適切なデータで事前に初期化された新しい不変または可変の行列を作成する静的メソッドCreateImmutableMatrixを定義します。CreateMutableMatrixMatrix

可変クラスは、自分自身を に渡し、自分自身を返し、自分自身を に渡すように実装する必要がAsImmutableあります。CreateImmutableMatrixAsMutableAsNewMutableCreateMutableMatrix

不変クラスはAsImmutable、自分自身を返し、AsMutableを呼び出しAsNewMutableAsNewMutable自分自身を に渡すために実装する必要がありCreateMutableMatrixます。

読み取り専用ラッパーは、ラップされたオブジェクトAsImmutableを呼び出すために実装する必要があり、ラップされたオブジェクトを呼び出す必要があります。AsImmutableAsMutableAsNewMutableAsNewMutable

コピーまたは変更する必要がある場合と必要ない場合があるマトリックスを受け取るオブジェクトは、単純にそれをフィールド (例: Foo) に格納することができます。マトリックスを変更する必要がある場合は、 に置き換えることができFooますFoo.AsMutable()。マトリックスを含むオブジェクトをコピーする必要がある場合は、コピー内のフィールドを変更する必要があるかどうかに応じて、コピー内のフィールドを または に置き換える必要がありますFoo.AsImmutable()Foo.AsNewMutable()

于 2012-11-12T22:47:04.107 に答える
-1

はい String(Immutable class)の振る舞いを見ると、中身が同じなら同じオブジェクトが返ってくるので、clone()メソッドはこれだけ返せばいいと思います。

于 2012-11-03T10:05:18.730 に答える