こんばんは。
かなり複雑な質問があります。Java を練習するために、標準ライブラリーのデータ構造のいくつかを再実装してきました。スタック、LinkedList、ツリーなど。非常に単純な例を使用して、またはメソッドが使用されjava.util.Stack
たときにクラスがディープ コピーを実行することを確認しました。目的はクラスの内容を外部の干渉から保護することであるため、これは理解できます。これまでのところ、スタックの私自身の実装 (単純な配列を使用した素朴な実装、リンクされたリストは後で提供されます) では、これをまったく気にしませんでした:peek()
pop()
public class ArrayStack<T> implements Stack<T> {
private T[] data; // Will expand the array when stack is full.
private int top; // serves as both top and count indicator.
...
...
@Override
public T pop() throws EmptyStackException {
if(top == -1)
throw new EmptyStackException("Stack is empty.");
return data[top--]; // Shallow copy, dangerous!
}
残念ながら、ジェネリックはインスタンス化できないため、コピー コンストラクターを想定してreturn new T(data[top--]);
、SO で見回したようなことを行うことはできませんclone()
。このスレッドは、クラスの署名を次のように拡張することを提案しています。
public class ArrayStack<T extends DeepCloneableClass> implements Stack<T>
...
whereDeepCloneableClass
は、「ディープ クローニング」を可能にするインターフェイスを実装するクラスです (関連する詳細については、そのスレッドのトップの応答を参照してください)。String
もちろん、この方法の問題点は、 のような標準クラスから、または私のそのカスタム クラスを拡張することを本当に期待できないことInteger
です。もちろん、既存のすべての jUnit テストは、コンパイル時に文句を言います。それらは整数と文字列のスタックに依存しているためです。したがって、このソリューションが実行可能であるかのようには感じません。
このスレッドは、ほぼすべてのオブジェクトのクローンを作成するためにサードパーティ ライブラリを使用することを提案しています。このライブラリはまだサポートされているように見えますが (最新のバグ修正は 1 か月以内に行われています)、サードパーティのツールに依存せず、Java が提供してくれるものは何でも使用したいと思います。この理由は、これらの ADT のソース コードがいつか大学生と共有される可能性があるためです。余分なツールをインストールする負担を彼らに負わせたくないからです。
pop()
したがって、peek()
、popFront()
、 などのメソッドへの単純なインターフェースを可能にしながら、汎用 Java データ構造の内部整合性を維持するための単純で、可能であれば効率的な方法を探しています。
助けてくれてどうもありがとう!
ジェイソン