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
ClassLoader
s che gli utenti vorranno fornire come parametri sono effettivamenteURLClassLoader
s (da quelli personalizzati a quelli di app Web); - il
ClassLoader
non è un'API molto conosciuta eURLClassLoader
è piuttosto oscuro e gli utenti non dovrebbero imparare le funzionalità diClassLoader
per utilizzare la mia API; - il lancio di un
ClassLoader
inURLClassLoader
rende 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)
?