私はこの問題に遭遇しました。一言で言えば、同じクラスの2つのオブジェクトをインスタンス化します。一方のオブジェクトでメソッドを実行すると、もう一方のオブジェクトも、2番目のオブジェクトでメソッドを明示的に呼び出したかのように影響を受けます。誰かが私にこれを手に入れてくれないかと思っていました。
仮に、クラスがありPortfolioます...
public class Portfolio implements Cloneable {
public ArrayList<Instrument> portfolio;
private String name;
private String description;
public Portfolio() {
portfolio = new ArrayList<Instrument>();
}
public Portfolio(Portfolio copyFrom) {
//attempt to copy the object by value
this.portfolio = (ArrayList<Instrument>) copyFrom.portfolio.clone();
this.name = copyFrom.name;
this.description = copyFrom.description;
}
public void applyStress(Stress stress) {
this.portfolio.set(0,this.portfolio.get(0)+1;
}
1番目のコンストラクターは、オブジェクトなどをインスタンス化するために使用されます。2番目のコンストラクターは、オブジェクトを値でコピーするために使用されます。
メソッドapplyStressは、合計計算を実行するために使用されます。この例では、メソッドを簡略化して、オブジェクト内にあるものに+1を追加するだけです。
したがって、オブジェクトを次のようにインスタンス化します
Portfolio p = new Portfolio();
portfolioそれから私はフィールド、いくつかの楽器に割り当てます。
p.portfolio = someInstrumentList;
次に、値で次のようにコピーしportfolio pますpCopy。
Portfolio pCopy = new Portfolio(p);
したがって、現時点では、同じオブジェクトが2つあります。もう1つは、値によるコピーオブジェクトです。のフィールドの値を変更しても、のpCopy同じフィールドには影響しませんp。
ここで、でメソッドを実行するapplyStressとp、の機器リストの値pCopyも変更されます。
言い換えれば、もしp.portfolio.get(0) == 1、その後、私はそれがであるとp.applyStress見ることを期待しますp.portfolio.get(0)2pCopy.portfolio.get(0)1
しかし、代わりに私が見ているのp.portfolio.get(0)は2、pCopy.portfolio.get(0)2
なぜこれが起こるのかわかりません。静的修飾子がないため、static修飾子の問題ではありません。誰かアイデアはありますか?