úterý 18. října 2011

Validace vstupních parametrů metod.

Všechny vstupní parametry metod je vhodné validovat na jejich korektnost dříve než se s nimi začne pracovat.
V 90% případů mi stačí zkontrolovat, že vstupní parametr není null.
Joshua Bloch radí vyhodit NullPointerException, ale já, a troufám si tvrdit že i velká část java komunity, preferuje IllegalArgumentException.
Kód by mohl vypadat třeba takto
    public void foo(final String request) {
        if (request == null) {
            throw new IllegalArgumentException("Parameter 'request' can't be null.");
        }
    }
Protože nejsem na světě sám, co potřebuje validovat vstupní parametry, existuje spousta knihoven, které lze pro tyto účely využít (psát vlastní validační knihovnu považuji jen za zvyšování chaosu ve vesmíru).
První možností je třída org.apache.commons.lang.Validate z knihovny Apache Commons Lang.
    public void foo(final String request) {
        Validate.notNull(request, "Parameter 'request' can't be null.");     
    }
Místo původních třech řádků jen jeden. Na skoro všech projektech ale používám i Spring, tak proč nepoužít třídu org.springframework.util.Assert, která je hodně podobná org.apache.commons.lang.Validate?
    public void foo(final String request) {
        Assert.notNull(request, "Parameter 'request' can't be null.");
    }
Samotní autoři nedoporučují použít tuto třídu! Citace z javadocu:
Mainly for internal use within the framework; consider Jakarta's Commons Lang >= 2.0 for a more comprehensive suite of assertion utilities.
Další možnou variantou je knihovna Guava.
    public void foo(final String request) {
        Preconditions.checkNotNull(request, "Parameter 'request' can't be null.");
    }
Na té se mi ale nelíbí, že vyhazuje NullPointerException a varianta checkArgument, která vyhazuje IllegalArgumentException má vytaženou podmínku ven z metody, čímž se kontrola lehce komplikuje.
    public void foo(final String request) {
        Preconditions.checkArgument(request != null, "Parameter 'request' can't be null.");
    }
Já osobně zůstanu u třídy Validate. Jak validujete parametry metod vy?