code: public V computeAndGet(final K key, final V value) {
          V result = this.cache.get(key);
          if (result == null) {
              result = this.cache.putIfAbsent(key, value);
              if (result == null) {
                  result = value;
                  final int excessElements = this.cache.size() - this.maxElements;
                  for (int i = 0; i < excessElements; i++) {
                      final K keyToRemove = this.keysQueue.poll();
                      this.cache.remove(keyToRemove);
                  }
                  this.keysQueue.add(key);
              }
          }
          return result;
      }
docs: <p>
  Puts a value into the cache and returns it. If a value already
  existed for the same key, the existing value is not modified and is
  returned instead of the one passed as parameter. This ensures only one
  object for each key exists at a time.
  </p>
  
  @param key the key to which the value will be assigned
  @param value the value which will be added to the map
  @return the value added to the map (or the one already existing at the map)