code: @NonNull
    public Caffeine<K, V> expireAfterAccess(@NonNegative long duration, @NonNull TimeUnit unit) {
      requireState(expireAfterAccessNanos == UNSET_INT,
          "expireAfterAccess was already set to %s ns", expireAfterAccessNanos);
      requireState(expiry == null, "expireAfterAccess may not be used with variable expiration");
      requireArgument(duration >= 0, "duration cannot be negative: %s %s", duration, unit);
      this.expireAfterAccessNanos = unit.toNanos(duration);
      return this;
    }
docs: Specifies that each entry should be automatically removed from the cache once a fixed duration
  has elapsed after the entry's creation, the most recent replacement of its value, or its last
  read. Access time is reset by all cache read and write operations (including
  {@code Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by operations
  on the collection-views of {@link Cache#asMap}.
  <p>
  Expired entries may be counted in {@link Cache#estimatedSize()}, but will never be visible to
  read or write operations. Expired entries are cleaned up as part of the routine maintenance
  described in the class javadoc.
  <p>
  If you can represent the duration as a {@link java.time.Duration} (which should be preferred
  when feasible), use {@link #expireAfterAccess(Duration)} instead.
  
  @param duration the length of time after an entry is last accessed that it should be
  automatically removed
  @param unit the unit that {@code duration} is expressed in
  @return this {@code Caffeine} instance (for chaining)
  @throws IllegalArgumentException if {@code duration} is negative
  @throws IllegalStateException if the time to idle or variable expiration was already set