Ho scritto un'API Java che accetta ClassLoader s come parametro, anche se non accetterà alcun ClassLoader che non sia un URLClassLoader (perché sono interessato solo al metodo URLClassLoader::getURLs() ) :
/**
* @throws NullPointerException if classLoader is null.
* @throws IllegalArgumentException if classLoader is not a URLClassLoader
*/
public void addClassLoader(ClassLoader classLoader) {
if (!(classLoader instanceof URLClassLoader)) {
if (classLoader == null) {
throw new NullPointerException("classLoader must not be null");
} else {
throw new IllegalArgumentException("classLoader must be a URLClassLoader");
}
}
this.classLoaders.add((URLClassLoader)classLoader);
}
L'ho fatto per diversi motivi:
- l'aggiunta di una
ClassLoaderè una funzionalità piacevole, non imperdibile: la mia API accetta diversi tipi di input; - la stragrande maggioranza di
ClassLoaders che gli utenti vorranno fornire come parametri sono effettivamenteURLClassLoaders (da quelli personalizzati a quelli di app Web); - il
ClassLoadernon è un'API molto conosciuta eURLClassLoaderè piuttosto oscuro e gli utenti non dovrebbero imparare le funzionalità diClassLoaderper utilizzare la mia API; - il lancio di un
ClassLoaderinURLClassLoaderrende il codice client meno leggibile.
Tuttavia so che probabilmente dovrei far rispettare il fatto che accetterò solo URLClassLoader nel metodo perché ha senso dai dettagli della mia implementazione.
La mia domanda è: dato tutto è OK lasciare la firma del metodo come addClassLoader(ClassLoader) e non addClassLoader(URLClassLoader) ?