if (!plusSize && (context == null)) { if (!plusStack) { if (!plusTime) { return new InstanceStats(ref);
if (context != null) {      return new WithTimeStackSizeContext(ref, time, stack, context); } else if (plusTime) { if (plusStack) { if (plusSize) { return new WithTimeStackSize(ref, time, stack);
  static InstanceStats newInstanceStats(      Object obj,      boolean plusTime,      boolean plusStack,      boolean plusSize,      boolean plusContext) {    WeakReference ref = new WeakReference(obj);    long time = (plusTime ? System.currentTimeMillis() : -1);    Throwable stack = (plusStack ? new Throwable() : null);    InstanceContext context =       (plusContext ? InstanceContext.getInstanceContext() : null);    // return subclass with minimal fields, to save memory.    // we only implement some of the permutations noted below.    if (!plusSize && (context == null)) {       if (!plusStack) {        if (!plusTime) {          return new InstanceStats(ref);        } else {          return new InstanceStats.WithTime(ref, time);        }      }      return new InstanceStats.WithTimeStack(ref, time, stack);    }    return new InstanceStats.WithTimeStackSizeContext(        ref, time, stack, context);  }