code: public Interval getInstance(Long position, Granularity gran) {
          List<Object> key = Arrays.asList(new Object[]{position, gran});
          Interval result;
          synchronized (cache) {
              result = cache.get(key);
              if (result == null) {
                  if (position == null) {
                      result = new DefaultInterval(position, gran, position, gran);
                  } else {
                      result = new SimpleInterval(position, gran);
                  }
                  cache.put(key, result);
              }
          }
          return result;
      }
docs: Returns an interval representing a position on the timeline or other axis
  at a specified granularity. The interpretation of the
  <code>position</code> parameter depends on what implementation of
  {@link Granularity} is provided. For example, if the granularity
  implementation is {@link AbsoluteTimeGranularity}, the
  <code>position</code> is intepreted as a timestamp.
  
  @param position a {
  @ling Long} representing a single position on the timeline or other axis.
  If <code>null</code>, the interval will be unbounded.
  @param gran a {@link Granularity}.
  @return an {@link Interval}.