code: public static synchronized Object intern(Object obj) {
          FlyweightSet set;
          if ((set = cFlyweightSet) == null) {
              cFlyweightSet = set = new FlyweightSet();
          }
          return set.put(obj);
      }
docs: Just like {@link String#intern() String.intern}, except it generates
  flyweights for any kind of object, and it does not prevent them from
  being garbage collected. Calling intern on a String does not use the
  same String pool used by String.intern because those Strings are not
  always garbage collected. Some virtual machines free up Strings from the
  interned String pool, others do not.
  <p>
  For objects that do not customize the hashCode and equals methods,
  calling intern is not very useful because the object returned will
  always be the same as the one passed in.
  <p>
  The object type returned from intern is guaranteed to be exactly the
  same type as the one passed in. Calling intern on null returns null.
  
  @param obj Object to intern
  @return Interned object.
  @see FlyweightSet