1

collections基礎となるJavaマップのキーへの参照をエクスポートする必要があることに気づきました。実際のキー オブジェクトへの参照を提供したくはありませんが、それらのコピーを提供して、誰も値をいじったり、マップを台無しにしたりしないようにします。したがって、任意のジェネリック型のコピーを作成する必要があります。

Collections.nCopies私はすでにこれを実行するユーティリティクラスをメモリ内シリアル化で作成しましたが、それが物事のコピーも提供することに気付きました。

したがって、私が何をしているのかを理解するために、たとえば、他のキー値を指定して次の (より高い/より低い) キー値にアクセスする必要があります。

public class MapWrapper<T, K extends Comparable<K>>
    implements OtherThing<T, K>
{
    public K next (K current) {
        return ... cloned next highest key as per NavigableMap.higherKey()
    }
}

したがって、問題は、オブジェクトをコピーする方が良いかどうかです

T copy = Collections.nCopies(1,item).get(0)

または、オブジェクトをシリアライズしてからデシリアライズする

final ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream();
final ObjectOutputStream outputStream = new ObjectOutputStream(outputBuffer);
outputStream.writeObject(item);
outputStream.close();

final ByteArrayInputStream inputBuffer = new ByteArrayInputStream(buffer);
final ObjectInputStream inputStream = new ObjectInputStream(inputBuffer);T copy = null;
T item = null;
try {
    copy = (T)inputStream.readObject();
} catch (ClassNotFoundException e) {
    Logger.getLogger(SerialisationService.class.getName()).log(Level.WARNING, null, e);
}

inputStream.close();
inputBuffer.close();
outputBuffer.close();

a をコピーして簡単にテストするとLong、 のCollections.nCopies方が高速です (0 ms / 8 ms)。しかし、この遅い時間に私が考えることができないその方法に対するいくつかの警告はありますか、それともキーのコピーを取得するためのより良い方法を考えてもらえますか?

4

1 に答える 1

4

大きな違いがあります -Collections.nCopiesオブジェクトをコピーしません! List含まれているエントリを返すだけnで、そのすべてが提供されたオブジェクトです (ソースを確認してください!)。そのリストから選択したものに加えられた変更は、元のオブジェクトに反映されます。したがって、このコード:

Point original = new Point(0, 0);
Point supposedCopy = Collections.nCopies(1, original).get(0);
supposedCopy.x = 13;
System.out.println("x = " + original.x); 

印刷さ13れません0。おっとっと。

シリアル化の往復は悪い考えではありません。別の方法は を使用するCloneableことですが、残念ながらこれは壊れています。Cloneableは を宣言していませんがclone()、のように宣言されprotectedObjectいるため、リフレクションによって呼び出す必要があります。

個人的には、可能であれば、あなたの状況で不変オブジェクトを使用したいと思います。

于 2012-07-16T18:13:28.823 に答える