class QueryStringDecoderUtil {

    public Map<String, List<String>> parameters() {
        if (params == null) {
            if (hasPath) {
                int pathLength = path().length();
                if (uri.length() == pathLength) {
                    return Collections.emptyMap();
                }
                decodeParams(uri.substring(pathLength + 1));
            } else {
                if (uri.isEmpty()) {
                    return Collections.emptyMap();
                }
                decodeParams(uri);
            }
        }
        return params;
    }

    public  QueryStringDecoderUtil(String uri);
    public  QueryStringDecoderUtil(String uri, boolean hasPath);
    public  QueryStringDecoderUtil(String uri, Charset charset);
    public  QueryStringDecoderUtil(String uri, Charset charset, boolean hasPath);
    public  QueryStringDecoderUtil(String uri, Charset charset, boolean hasPath, int maxParams);
    public  QueryStringDecoderUtil(URI uri);
    public  QueryStringDecoderUtil(URI uri, Charset charset);
    public  QueryStringDecoderUtil(URI uri, Charset charset, int maxParams);

}