2016-06-24 11 views
2

たとえば、List<Item>などのアイテムのコレクションがあり、アイテムのいずれかの値がセッターによって変更されるなど、ラッパークラスからアイテムが変更されているかどうかを確認する必要があります。オブジェクトの変更を検出する方法は?

List<Item> items = itemsWrapper.getItems(); // itemsWrapper contains a list of items 
Item anItem = items.get(index); 
item.setProperty(property); 
itemsWrapper.hasChanged(); // ?????? 

私は最後の声明などを達成する方法を見つけようとしています。

this oneのような類似の質問がありますが、Hibernateの使用が推奨されていますが、答えは非常に曖昧で、私の質問はDB関連ではありません。また、リスナーのリストを設定することについても言及していますが、私は彼のことができたかどうかは分かりません。

this other questionここで、選択された答えは、プロパティを変更するたびに上昇する必要があるdirtyフラグを使用することを示しています。しかし、私のクラスは実際により汚れたを得て、逆説的に、項目のプロパティを変更する数十のメソッドを変更する必要があります。

別の方法がありますか?透明であれば最適ですか?

+2

"Observer" Pattern:itemsWrapperは変更の対象を観察します。 – Fildor

+0

私たちにもっと背景を教えてもらえますか?私はあなたがコレクション自体ではなく、変更のために他の場所を監視したいと思うかもしれないと思う。 –

+0

@Fildor私はオブザーバーパターンのアプローチもチェックしましたが、実際に "自分のコードをもっと汚くする"という点で、それが "ダーティ"フラグアプローチとどのように違うのか分かりません。オブジェクトの変更方法)。 – dabadaba

答えて

0

単純に、オブジェクトを非公開広告で作成してゲッターとセッターを作成します。これにより、ラッパーがリスト内の何かを変更したときに取得できます。

新しい要素がリストに追加されたときに、配列に要素を追加する3番目の加算メソッドを作成できます。

+0

@TimBiegeleisen Corrected –

0

java.util.Observableのクラスを使用することをお勧めします。使用ケースにはboolean hasChanged()という機能があります。 これは参考答えです: When should we use Observer and Observable

単なる例:

<code>import java.util.Observable; 
import java.util.Observer; 
// First observer 
class FirstNewsReader implements Observer { 
    public void update(Observable obj, Object arg) { 
     System.out.println("FirstNewsReader got The news:"+(String)arg); 
    } 
} 
//Second Observer 
class SecondNewsReader implements Observer { 
    public void update(Observable obj, Object arg) { 
     System.out.println("SecondNewsReader got The news:"+(String)arg); 
    } 
} 
// This is the class being observed. 
class News extends Observable { 
    void news() { 
     String[] news = {"News 1", "News 2", "News 3"}; 
     for(String s: news){ 
      //set change 
      setChanged(); 
      //notify observers for change 
      notifyObservers(s); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.out.println("Error Occurred."); 
      } 
     } 
    } 
} 
//Run Observer and Observable 
class ObserverObservableDemo { 
    public static void main(String args[]) { 
     News observedNews = new News(); 
     FirstNewsReader reader1 = new FirstNewsReader(); 
     SecondNewsReader reader2 = new SecondNewsReader(); 
     observedNews.addObserver(reader1); 
     observedNews.addObserver(reader2); 
     observedNews.news();   
    } 
}</code> 
+0

結果のレイアウトの簡単なレイアウトを教えてください。私はそれをどのように設定すべきかを理解できません。 – dabadaba

+0

@dabadaba:私の編集した回答を見てください –

0

あなたItem /ラッパークラスのためのオブザーバーパターンを使用してください。すでにサポートされているJavaFX(java 7.something以降に含まれています)のプロパティは、このような機能のサポートを提供します。

例:

class Item { 

    private final ObjectProperty<Object> property = new SimpleObjectProperty<Object>(); 

    public final Object getProperty() { 
     return this.property.get(); 
    } 

    public final void setProperty(Object value) { 
     this.property.set(value); 
    } 

    public final ObjectProperty<Object> propertyProperty() { 
     return this.property; 
    } 
} 
class Listener implements InvalidationListener { 

    private boolean changed = false; 

    @Override 
    public void invalidated(Observable observable) { 
     changed = true; 
    } 

    public boolean isChanged() { 
     return changed; 
    } 

    public void resetChanged() { 
     this.changed = false; 
    } 

} 
// trigger update changes when the property changes 
ObservableList<Item> list = FXCollections.observableArrayList(e -> new Observable[]{e.propertyProperty()}); 

list.addAll(new Item(), new Item()); 

Listener listener = new Listener(); 
list.addListener(listener); 
System.out.println(listener.isChanged()); 

list.get(0).setProperty(""); 
System.out.println(listener.isChanged()); 
listener.resetChanged(); 

list.get(1).setProperty(1); 
System.out.println(listener.isChanged()); 

listener.resetChanged(); 

list.add(new Item()); 
System.out.println(listener.isChanged()); 
0

最も透明な方法では、Spring AOPはAspectJを使用しています。 Aspectクラスを作成し、item.setProperty()メソッドに@Beforeまたは@afterアノテーションを使用します。

+0

詳細を教えてください。 – dabadaba

+0

ここに、メソッドがhttp://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/と呼ばれるときに記録する簡単な例を示します。 –

関連する問題