code: private ULocale addLikelySubtags(ULocale languageCode) {
          // max("und") = "en_Latn_US", and since matching is based on maximized tags, the undefined
          // language would normally match English.  But that would produce the counterintuitive results
          // that getBestMatch("und", LocaleMatcher("it,en")) would be "en", and
          // getBestMatch("en", LocaleMatcher("it,und")) would be "und".
          //
          // To avoid that, we change the matcher's definitions of max (AddLikelySubtagsWithDefaults)
          // so that max("und")="und". That produces the following, more desirable results:
          if (languageCode.equals(UNKNOWN_LOCALE)) {
              return UNKNOWN_LOCALE;
          }
          final ULocale result = ULocale.addLikelySubtags(languageCode);
          // should have method on getLikelySubtags for this
          if (result == null || result.equals(languageCode)) {
              final String language = languageCode.getLanguage();
              final String script = languageCode.getScript();
              final String region = languageCode.getCountry();
              return new ULocale((language.length()==0 ? "und"
                  : language)
                  + "_"
                  + (script.length()==0 ? "Zzzz" : script)
                  + "_"
                  + (region.length()==0 ? "ZZ" : region));
          }
          return result;
      }
docs: We need to add another method to addLikelySubtags that doesn't return
  null, but instead substitutes Zzzz and ZZ if unknown. There are also
  a few cases where addLikelySubtags needs to have expanded data, to handle
  all deprecated codes.
  @param languageCode
  @return "fixed" addLikelySubtags