code: public void setBasenames(String... basenames) {
          if (basenames != null) {
              this.basenames = new String[basenames.length];
              for (int i = 0; i < basenames.length; i++) {
                  String basename = basenames[i];
                  if (!StringUtils.hasText(basename)) {
                      throw new IllegalArgumentException("Basename must not be empty");
                  }
                  this.basenames[i] = basename.trim();
              }
          } else {
              this.basenames = new String[0];
          }
      }
docs: Set an array of basenames, each following {@link java.util.ResourceBundle}
  conventions: essentially, a fully-qualified classpath location. If it
  doesn't contain a package qualifier (such as {@code org.mypackage}),
  it will be resolved from the classpath root.
  <p>The associated resource bundles will be checked sequentially
  when resolving a message code. Note that message definitions in a
  <i>previous</i> resource bundle will override ones in a later bundle,
  due to the sequential lookup.
  <p>Note that ResourceBundle names are effectively classpath locations: As a
  consequence, the JDK's standard ResourceBundle treats dots as package separators.
  This means that "test.theme" is effectively equivalent to "test/theme",
  just like it is for programmatic {@code java.util.ResourceBundle} usage.
  
  @param basenames the basenames
  @see #setBasename #setBasename
  @see java.util.ResourceBundle#getBundle(String) java.util.ResourceBundle#getBundle(String)