配列リストを反復処理するときに配列リストを変更しようとすると、ConcurrentModificationException エラーが発生するのは事実です。しかし、最初に変更する要素を削除し、リストを繰り返し処理してから要素を挿入し直した場合、どのようにしてエラーが引き続き発生するのでしょうか? ロジックがこのようなものである場合、concurrentmodificationexception をスローする理由がわかりません。
このプログラム全体が Observer パターンを使用しています。
このプログラムの目的は、複数のテキスト ボックスを用意することです。1 つ入力すると、他のテキスト ボックスは同じテキストで更新されます。
件名- インターフェイス
public interface Subject {
public void attach(Observer o);
public void detach(Observer o);
public void notifyAllObservers();
}
SubjectImpl - Subject を実装します
import java.util.*;
public class SubjectImpl implements Subject {
private List <Observer> observers;
public SubjectImpl(){
observers = new ArrayList<Observer>();
}
@Override
public void attach(Observer o) {
observers.add(o);
}
@Override
public void detach(Observer o) {
observers.remove(o);
}
@Override
public void notifyAllObservers() {
//Iterating code
for(Observer o: observers){
o.update();
}
}
}
オブザーバー- インターフェース
public interface Observer {
public void update();
}
エディター- オブザーバーを実装します
import java.awt.*
import java.io.*;
import javax.swing.*;
public class Editor extends JFrame implements DocumentListener, Observer {
private FileContentSubject reference;
private JScrollPane textAreaScrollPane;
private JTextArea textArea;
public Editor(FileContentSubject filecontentsubject) throws IOException {
super("Editor");
initComponents();
this.reference = filecontentsubject;
textArea.getDocument().addDocumentListener(reference);
textArea.getDocument().putProperty("ownerEditor", this);
}
private void initComponents(){
textArea = new JTextArea();
//set location, size, visible and defaultcloseoperation here
getContentPane().setLayout(new BorderLayout());
getContentPane().add(textArea, BorderLayout.CENTER);
}
@Override
public void update() {
textArea.setText(reference.getState()); //Call to update each text box
}
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
}
ファイル コンテンツ システム- オブザーバーの具体的なサブジェクトとして機能します (存在するのは 1 つだけです)。
import javax.swing.event.*;
import javax.swing.text.*;
public class FileContentSubject implements Subject, DocumentListener {
private String state; //Current, most recent copy of everything
public String getState() {
return this.state;
}
private SubjectImpl reference;
@Override
public void attach(Observer o) {
reference.attach(o);
}
@Override
public void detach(Observer o) {
reference.detach(o);
}
@Override
public void notifyAllObservers() {
reference.notifyAllObservers();
}
public FileContentSubject() {
reference = new SubjectImpl();
}
@Override
public void changedUpdate(DocumentEvent arg0) {
}
@Override
public void insertUpdate(DocumentEvent arg0) {
Document doc = (Document) arg0.getDocument();
try {
this.state = doc.getText(0, doc.getLength());
} catch (BadLocationException e) {
e.printStackTrace();
}
Editor e = (Editor) doc.getProperty("ownerEditor");
reference.detach(e);
notifyAllObservers();
reference.attach(e);
}
@Override
public void removeUpdate(DocumentEvent arg0) {
//same as insertUpdate(DocumentEvent arg0) ^^
}
}