I don't really like the "internal" prefix, but a private put() with the method 
signature you suggest would make sense.


On Apr 5, 2011, at 9:58 AM, Noel Grandin wrote:

> 
> A cleaner way to fix this would be to move the logic from put(K, V) into a 
> new method internalPut(K,V,boolean) which
> takes an extra parameter "fireMapListeners", have the put(K, V) method 
> delegate to internalPut, and have rehash() call
> internalPut(K, V, false)
> 
> -- Noel.
> 
> [email protected] wrote:
>> Author: gbrown
>> Date: Tue Apr  5 13:53:34 2011
>> New Revision: 1089046
>> 
>> URL: http://svn.apache.org/viewvc?rev=1089046&view=rev
>> Log:
>> Resolve PIVOT-725.
>> 
>> Modified:
>>    pivot/trunk/core/src/org/apache/pivot/collections/HashMap.java
>> 
>> Modified: pivot/trunk/core/src/org/apache/pivot/collections/HashMap.java
>> URL: 
>> http://svn.apache.org/viewvc/pivot/trunk/core/src/org/apache/pivot/collections/HashMap.java?rev=1089046&r1=1089045&r2=1089046&view=diff
>> ==============================================================================
>> --- pivot/trunk/core/src/org/apache/pivot/collections/HashMap.java (original)
>> +++ pivot/trunk/core/src/org/apache/pivot/collections/HashMap.java Tue Apr  
>> 5 13:53:34 2011
>> @@ -104,6 +104,8 @@ public class HashMap<K, V> implements Ma
>>     private int count = 0;
>>     private ArrayList<K> keys = null;
>> 
>> +    private boolean rehash = false;
>> +
>>     private transient MapListenerList<K, V> mapListeners = null;
>> 
>>     public static final int DEFAULT_CAPACITY = 16;
>> @@ -203,7 +205,8 @@ public class HashMap<K, V> implements Ma
>>                 previousValue = entry.value;
>>                 iterator.update(new Pair<K, V>(key, value));
>> 
>> -                if (mapListeners != null) {
>> +                if (mapListeners != null
>> +                    && !rehash) {
>>                     mapListeners.valueUpdated(this, key, previousValue);
>>                 }
>> 
>> @@ -229,7 +232,8 @@ public class HashMap<K, V> implements Ma
>>                 rehash(capacity * 2);
>>             }
>> 
>> -            if (mapListeners != null) {
>> +            if (mapListeners != null
>> +                && !rehash) {
>>                 mapListeners.valueAdded(this, key);
>>             }
>>         }
>> @@ -363,6 +367,8 @@ public class HashMap<K, V> implements Ma
>>                 keys.clear();
>>             }
>> 
>> +            rehash = true;
>> +
>>             for (LinkedList<Pair<K, V>> bucket : previousBuckets) {
>>                 if (bucket != null) {
>>                     for (Pair<K, V> entry : bucket) {
>> @@ -370,6 +376,8 @@ public class HashMap<K, V> implements Ma
>>                     }
>>                 }
>>             }
>> +
>> +            rehash = false;
>>         }
>>     }
>> 
>> 
>> 
> 

Reply via email to