You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Martijn Dashorst (JIRA)" <ji...@apache.org> on 2014/09/23 15:08:34 UTC
[jira] [Commented] (WICKET-4972) Remove (or disarm) varargs
contructors of StringResourceModel (more of a pitfall than convenience)
[ https://issues.apache.org/jira/browse/WICKET-4972?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14144762#comment-14144762 ]
Martijn Dashorst commented on WICKET-4972:
------------------------------------------
We use the following class to wrap around StringResourceModel and I think it has a much better API:
{code:java}
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.StringResourceModel;
public class I18N implements Serializable
{
private static final long serialVersionUID = 1L;
private String key;
private Component component;
private IModel< ? > model;
private String defaultValue;
private List<Serializable> parameters = new ArrayList<>();
private I18N(String key)
{
this.key = key;
}
public static I18N of(String key)
{
return new I18N(key);
}
public I18N from(Component component)
{
this.component = component;
return this;
}
public I18N withModel(IModel< ? > model)
{
this.model = model;
return this;
}
public I18N with(Serializable parameter)
{
parameters.add(parameter);
return this;
}
public I18N withDefault(String defaultValue)
{
this.defaultValue = defaultValue;
return this;
}
public IModel<String> toStringModel()
{
return new StringResourceModel(key, component, model, defaultValue, parameters.toArray());
}
@Override
public String toString()
{
return toStringModel().getObject();
}
}
{code}
> Remove (or disarm) varargs contructors of StringResourceModel (more of a pitfall than convenience)
> --------------------------------------------------------------------------------------------------
>
> Key: WICKET-4972
> URL: https://issues.apache.org/jira/browse/WICKET-4972
> Project: Wicket
> Issue Type: Wish
> Components: wicket
> Affects Versions: 6.4.0
> Reporter: Peter Parson
> Assignee: Martin Grigorov
> Fix For: 7.0.0-M1
>
>
> The introduction of varargs constructors for StringResourceModel also introduced a pitfall which (IMO) outweighs the convenience of not explicitely having to create an array.
> When using this constructor:
> public StringResourceModel(final String resourceKey, final Component component, final IModel<?> model, final Object... parameters)
> one runs into problems when parameters are of type String (which probably happens more often than not), since the VM acutally ends up calling
> public StringResourceModel(final String resourceKey, final Component component, final IModel<?> model, final String defaultValue, final Object... parameters)
> From my experience, this happens repeatedly to Wicket newbies, but still to "veterans" sometimes.
> Example (does not work as one would expect):
> new StringResourceModel("my.resource.key", this, getModel(), "first param to replace", "second param to replace");
> Forcing to do either
> new StringResourceModel("my.resource.key", this, getModel(), null, "first param to replace", "second param to replace");
> or
> new StringResourceModel("my.resource.key", this, getModel(), newObject[]{"first param to replace", "second param to replace"});
> I think varargs is a convenient feature, but in this special case it introduces confusion, outweighing the convenience by far, thus I suggest to expect explicit array like before.
> Another solution might be to expect a Model<String> as defaultValue or to change the order of constructor arguments.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)