1
1
/*
2
- * Copyright 2002-2017 the original author or authors.
2
+ * Copyright 2002-2018 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
54
54
* {@linkplain SoftReference soft entry references}.
55
55
*
56
56
* @author Phillip Webb
57
+ * @author Juergen Hoeller
57
58
* @since 3.2
58
59
* @param <K> the key type
59
60
* @param <V> the value type
@@ -226,19 +227,30 @@ protected int getHash(@Nullable Object o) {
226
227
227
228
@ Override
228
229
@ Nullable
229
- public V get (Object key ) {
230
- Reference <K , V > reference = getReference (key , Restructure .WHEN_NECESSARY );
231
- Entry <K , V > entry = (reference != null ? reference .get () : null );
230
+ public V get (@ Nullable Object key ) {
231
+ Entry <K , V > entry = getEntryIfAvailable (key );
232
232
return (entry != null ? entry .getValue () : null );
233
233
}
234
234
235
235
@ Override
236
- public boolean containsKey (Object key ) {
237
- Reference <K , V > reference = getReference (key , Restructure .WHEN_NECESSARY );
238
- Entry <K , V > entry = (reference != null ? reference .get () : null );
236
+ @ Nullable
237
+ public V getOrDefault (@ Nullable Object key , @ Nullable V defaultValue ) {
238
+ Entry <K , V > entry = getEntryIfAvailable (key );
239
+ return (entry != null ? entry .getValue () : defaultValue );
240
+ }
241
+
242
+ @ Override
243
+ public boolean containsKey (@ Nullable Object key ) {
244
+ Entry <K , V > entry = getEntryIfAvailable (key );
239
245
return (entry != null && ObjectUtils .nullSafeEquals (entry .getKey (), key ));
240
246
}
241
247
248
+ @ Nullable
249
+ private Entry <K , V > getEntryIfAvailable (@ Nullable Object key ) {
250
+ Reference <K , V > reference = getReference (key , Restructure .WHEN_NECESSARY );
251
+ return (reference != null ? reference .get () : null );
252
+ }
253
+
242
254
/**
243
255
* Return a {@link Reference} to the {@link Entry} for the specified {@code key},
244
256
* or {@code null} if not found.
@@ -254,28 +266,28 @@ protected final Reference<K, V> getReference(@Nullable Object key, Restructure r
254
266
255
267
@ Override
256
268
@ Nullable
257
- public V put (K key , V value ) {
269
+ public V put (@ Nullable K key , @ Nullable V value ) {
258
270
return put (key , value , true );
259
271
}
260
272
261
273
@ Override
262
274
@ Nullable
263
- public V putIfAbsent (K key , V value ) {
275
+ public V putIfAbsent (@ Nullable K key , @ Nullable V value ) {
264
276
return put (key , value , false );
265
277
}
266
278
267
279
@ Nullable
268
- private V put (final K key , final V value , final boolean overwriteExisting ) {
280
+ private V put (@ Nullable final K key , @ Nullable final V value , final boolean overwriteExisting ) {
269
281
return doTask (key , new Task <V >(TaskOption .RESTRUCTURE_BEFORE , TaskOption .RESIZE ) {
270
282
@ Override
271
283
@ Nullable
272
284
protected V execute (@ Nullable Reference <K , V > reference , @ Nullable Entry <K , V > entry , @ Nullable Entries entries ) {
273
285
if (entry != null ) {
274
- V previousValue = entry .getValue ();
286
+ V oldValue = entry .getValue ();
275
287
if (overwriteExisting ) {
276
288
entry .setValue (value );
277
289
}
278
- return previousValue ;
290
+ return oldValue ;
279
291
}
280
292
Assert .state (entries != null , "No entries segment" );
281
293
entries .add (value );
@@ -342,9 +354,9 @@ public V replace(K key, final V value) {
342
354
@ Nullable
343
355
protected V execute (@ Nullable Reference <K , V > reference , @ Nullable Entry <K , V > entry ) {
344
356
if (entry != null ) {
345
- V previousValue = entry .getValue ();
357
+ V oldValue = entry .getValue ();
346
358
entry .setValue (value );
347
- return previousValue ;
359
+ return oldValue ;
348
360
}
349
361
return null ;
350
362
}
@@ -389,7 +401,7 @@ public Set<java.util.Map.Entry<K, V>> entrySet() {
389
401
}
390
402
391
403
@ Nullable
392
- private <T > T doTask (Object key , Task <T > task ) {
404
+ private <T > T doTask (@ Nullable Object key , Task <T > task ) {
393
405
int hash = getHash (key );
394
406
return getSegmentForHash (hash ).doTask (hash , key , task );
395
407
}
@@ -488,7 +500,7 @@ public Reference<K, V> getReference(@Nullable Object key, int hash, Restructure
488
500
* @return the result of the operation
489
501
*/
490
502
@ Nullable
491
- public <T > T doTask (final int hash , final Object key , final Task <T > task ) {
503
+ public <T > T doTask (final int hash , @ Nullable final Object key , final Task <T > task ) {
492
504
boolean resize = task .hasOption (TaskOption .RESIZE );
493
505
if (task .hasOption (TaskOption .RESTRUCTURE_BEFORE )) {
494
506
restructureIfNecessary (resize );
@@ -504,7 +516,7 @@ public <T> T doTask(final int hash, final Object key, final Task<T> task) {
504
516
Entry <K , V > entry = (reference != null ? reference .get () : null );
505
517
Entries entries = new Entries () {
506
518
@ Override
507
- public void add (V value ) {
519
+ public void add (@ Nullable V value ) {
508
520
@ SuppressWarnings ("unchecked" )
509
521
Entry <K , V > newEntry = new Entry <>((K ) key , value );
510
522
Reference <K , V > newReference = Segment .this .referenceManager .createReference (newEntry , hash , head );
@@ -617,7 +629,7 @@ private Reference<K, V> findInChain(Reference<K, V> reference, @Nullable Object
617
629
Entry <K , V > entry = currRef .get ();
618
630
if (entry != null ) {
619
631
K entryKey = entry .getKey ();
620
- if (entryKey == key || entryKey . equals ( key )) {
632
+ if (ObjectUtils . nullSafeEquals ( entryKey , key )) {
621
633
return currRef ;
622
634
}
623
635
}
@@ -688,27 +700,32 @@ protected interface Reference<K, V> {
688
700
*/
689
701
protected static final class Entry <K , V > implements Map .Entry <K , V > {
690
702
703
+ @ Nullable
691
704
private final K key ;
692
705
706
+ @ Nullable
693
707
private volatile V value ;
694
708
695
- public Entry (K key , V value ) {
709
+ public Entry (@ Nullable K key , @ Nullable V value ) {
696
710
this .key = key ;
697
711
this .value = value ;
698
712
}
699
713
700
714
@ Override
715
+ @ Nullable
701
716
public K getKey () {
702
717
return this .key ;
703
718
}
704
719
705
720
@ Override
721
+ @ Nullable
706
722
public V getValue () {
707
723
return this .value ;
708
724
}
709
725
710
726
@ Override
711
- public V setValue (V value ) {
727
+ @ Nullable
728
+ public V setValue (@ Nullable V value ) {
712
729
V previous = this .value ;
713
730
this .value = value ;
714
731
return previous ;
@@ -800,7 +817,7 @@ private abstract class Entries {
800
817
* Add a new entry with the specified value.
801
818
* @param value the value to add
802
819
*/
803
- public abstract void add (V value );
820
+ public abstract void add (@ Nullable V value );
804
821
}
805
822
806
823
0 commit comments