How to avoid having multiple methods with different arguments for url construction

Tags:



How to avoid having multiple methods with different arguments for url construction. I would like to optimize this further

protected String invUrl() {
    return endpointUrl("invs", null, null);
}   

protected String invUrl(String id) {
    return endpointUrl("invs", id, null);
}   

protected String invUrl(String id, String action) {
    return endpointUrl("invs", id, action);
}   

protected String endpointUrl(String entity, String id, String action) {

    if (id != null && action != null) {
        return UriComponentsBuilder.newInstance().scheme("http").host("localhost").port(serverPort)
            .path("/mat/api/v1/" + entity + "/" + id + "/" + action).build().toUriString();
    } else if (id != null) {
        return UriComponentsBuilder.newInstance().scheme("http").host("localhost").port(serverPort)
            .path("/mat/api/v1/" + entity + "/" + id).build().toUriString();
    } else {
        return UriComponentsBuilder.newInstance().scheme("http").host("localhost").port(serverPort)
            .path("/mat/api/v1/" + entity).build().toUriString();
    }   
}

Answer

One way to create an object called Endpoint which holds the required values:

public class Endpoint {
    private String entity;
    private String id;
    private String action;

    public Endpoint(String entity, String id, String action) {
        this.entity = entity;
        this.id = id;
        this.action = action;
    }

    // getters, toString etc.
}

Then you can have only one invUrl method to which id and action can be passed and Endpoint object can be constructed. This can be passed to endpointUrl method:

protected String invUrl(String id, String action) {
        return endpointUrl(new Endpoint("invs", id, action));
    }

Then, endpointUrl method can be modified as:

protected String endpointUrl(Endpoint endpoint) {
        StringBuilder pathBuilder = new StringBuilder("/mat/api/v1/").append(endpoint.getEntity());
        if(endpoint.getId() != null) {
            pathBuilder.append("/").append(endpoint.getId());
        }
        if(endpoint.getAction() != null) {
            pathBuilder.append("/").append(endpoint.getAction());
        }
        return UriComponentsBuilder.newInstance().scheme("http").host("localhost").port(serverPort)
                .path(pathBuilder.toString()).build().toUriString();
    }


Source: stackoverflow