2014-11-18 9 views
18

कुछ संदर्भों में यह पता लगाना आवश्यक है - सूची सूची में, सूची के बारे में नियंत्रण के बिना - एक "सभी डेटा स्वैप आउट", f.i. जब हमें चयन जैसे कुछ राज्य को साफ़ करने की आवश्यकता होती है - पूरी तरह से नए डेटा पर पुराना राज्य व्यर्थ है।पर्यवेक्षण सूची: एक सेट को विश्वसनीय रूप से कैसे पहचानें?

पूरी तरह से नया डेटा

  • list.setAll (...) द्वारा पहुंचा जा सकता
  • list.set (otherObservableList) यदि सूची एक ListProperty

के प्रकार के बारे में सोच है परिवर्तन सेट पर निकाल दिया जा सकता है (सी परिवर्तन है, आइटम उपनिवेशों की गिनती के लिए "सबचेंजकाउंट" छद्म कोड है):

// initially empty 
assertEquals(0, items.size()); 
items.setAll(1, 2, 4); 
assertEquals(1, c.subChangeCount()); 
assertTrue(c.wasAdded() && !c.wasReplaced()); 
assertEquals(0, c.getFrom()); 
assertEquals(c.getList().size(), c.getAddedSize()); 

// initially not empty 
assertTrue(items.size() > 0); 
items.setAll(1, 2, 4); 
assertEquals(1, c.subChangeCount()); 
assertTrue(c.wasReplaced()); 
assertEquals(0, c.getFrom()); 
assertEquals(c.getList().size(), c.getAddedSize()); 

इस तरह एक उपयोगिता की जांच की अनुमति के लिए लगता है:

boolean wasSetOrClearedAll(Change c) { 
    if (c.getList().isEmpty()) return true; 
    c.next(); 
    if (c.getAddedSize() == c.getList().size()) return true; 
    return false; 
} 

इसके विपरीत, आंतरिक fx कोड, f.i. ComboBox 'आइटम को सुनने में:

while (c.next()) { 
    comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize(); 
    ... 
} 
comboBox.previousItemCount = getItemCount(); 

भंडार वर्ष ITEMCOUNT और कहा कि वर्तमान removedSize के खिलाफ (जो मैं के साथ असहज कर रहा हूँ, पुरानी स्थिति मेरे स्वाद के लिए बासी अभी तक भी अक्सर हो जाता है) की तुलना, फिर भी वहाँ एक अच्छी संभावना है कि मैं अपने दृष्टिकोण के साथ कुछ याद कर रहा हूँ।

प्रश्न है:

जो संदर्भ में

मेरी उपयोगिता विधि विफल हो जाएगा (और कोर दृष्टिकोण सही ढंग से setAll का पता लगाने के हैं)?

+0

आपके द्वारा उपयोग किए जाने वाले पर्यवेक्षण सूची का ठोस प्रकार क्या है? ऐसा लगता है कि ListProperty एक अमूर्त वर्ग है जो setAll (...) – Zeki

+0

@zeki hmm घोषित नहीं करता है .. सभी पर्यवेक्षी सूची में एक सेट (टी ... आइटम) होना चाहिए - निश्चित रूप से असमर्थित हो सकता है, इसलिए इसे ले जाएं कार्यान्वित किया गया है (ListProperty कुछ खास नहीं है, यह बस इसकी बैकिंग सूची के सेट को रूट करता है) – kleopatra

+0

उस स्थिति में, क्या आप ListProperty का विस्तार कर सकते हैं और सुपर विधि को कॉल करने से पहले एक ईवेंट ट्रिगर कर सकते हैं? – Zeki

उत्तर

4

दुर्भाग्य से श्रोता पक्ष पर इसका पता लगाने का कोई विश्वसनीय तरीका नहीं है।

संघर्ष डिफ़ॉल्ट अंतर्गत प्रयोग किया, जो ज्यादातर इस तरह दिखता है के साथ शुरू होता:

@Override 
public boolean setAll(Collection<? extends E> col) { 
    beginChange(); 
    try { 
     clear(); 
     addAll(col); 
    } finally { 
     endChange(); 
    } 
    return true; 
} 

आप परिणाम और घटना है कि निकाल दिया जाता है setAll को एक खाली संग्रह पार कर लेते हैं दोनों बिल्कुल के रूप में जब तुम ही कर रहे हैं clear कहा जाता है।

तो आपकी विधि wasSetOrClearedAlltrue लौटाती है जब clear भी (मूल कार्यान्वयन के रूप में) कहा जाता है।

तो अंत में setAll का कोई सामान्य पता नहीं है, यह सब आपके उपयोग-मामले पर निर्भर करता है। यदि आप पहचानने की कोशिश कर रहे हैं तो आप इसे संकुचित कर सकते हैं, इसके लिए आप एक फ़िल्टर लिख सकते हैं।

+0

आह ... मूल कार्यान्वयन को देखने पर भी विचार नहीं किया ;-) अच्छा तर्क, धन्यवाद! स्पष्ट/सेट सभी एक जैसा है - मूल रूप से मुझे पुरानी वस्तुओं से संबंधित सभी राज्य को विश्वसनीय रूप से फेंकने के कुछ साधनों की आवश्यकता है (आइटम के संदर्भ के बिना, केवल उनके पूर्व पदों पर)। हम्म ... – kleopatra

+0

और ListChangeListener.Change.getRemoved()/getFrom()/getTo() को साफ करने के लिए पर्याप्त नहीं है? – eckig

+0

हम्म .. अगर मैं चयन मॉडल के मूल कार्यान्वयन का पालन नहीं करता हूं। हालांकि, नरक के रूप में छोटी गाड़ी हैं। शायद स्क्रैच से सोचने की जरूरत है, शायद सेट सभी इस तरह का एक विशेष मामला नहीं है, सब के बाद :-) – kleopatra

संबंधित मुद्दे