我编写了一个小型 Web API,可以轻松创建 URI。每个资源类应该包含一个方法createURI
,它接受所需的参数。此方法应在后台使用辅助方法 populateUriTemplate
来创建 URI 字符串。 populateUriTemplate
需要键值对来填充 URI 模板。在另一种语言(如 Scala 或 Python)中,我会使用命名参数,但 Java 不支持它们。那么问题来了:如何在Java中模拟命名参数?
直接的解决方案是创建 map :
public String createUri(int id, String name){
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", id);
params.put("name", name);
return populateUriTemplate(params);
}
但我不喜欢先创建一个 map 并将每个参数放入其中。
另一个想法是使用静态方法param
来创建键值对:
public String createUri(int id, String name){
return populateUriTemplate(param("id", id), param("name", name));
}
对我来说看起来好多了!
即使需要更多字符,也可以对其进行一些改进,使其更加不言自明:
public String createUri(int id, String name){
return populateUriTemplate(key("id").value(id), key("name").value(name));
}
我也想到了 builder pattern ,但这将迫使我的 API 的用户为每个资源类创建一个显式构建器,这将是乏味而没有好处的。参数的类型并不重要,只要存在正确实现的 toString
方法即可。
我最喜欢的是上述静态方法的两种方法之一(param(key, value)
或 key(k).value(v)
)。在这种情况下,您知道模拟命名参数的更好方法吗?
最佳答案
有关构建器模式的一些想法,您可以查看 this斯蒂芬·施密特 (Stephan Schmidt) 的博客文章。
您还给了我用流畅的界面执行以下操作的想法,a Callable
,和一个静态方法:
createUri().id(5).name("dennetik").call();
这需要创建一个 Callable
具有静态方法的类( CreateUri
):
public static final CreateUriFluentInterface createUri() {
return FluentInterface.of(new CreateUri(), CreateUriFluentInterface.class);
}
还有一个流畅的界面,如下所示:
public interface CreateUriFluentInterface {
public CreateUriFluentInterface id(Integer id);
public CreateUriFluentInterface name(String name);
}
这不是那么多的样板代码,不是吗?
(嗯,如果你把那个可怕的名字 CreateUriFluentInterface
调低一点,那就不是了。)
(您可能需要 CreateUriFluentInterface
扩展 Callable<String>
,以便能够将调用重新路由到 Callable#call()
)
关于java - 在 Java 中模拟命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078978/