java - 在 Java 中模拟命名参数

标签 java builder named-parameters

我编写了一个小型 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/

相关文章:

Java注释处理器来分析表达式?

java - Java数组如何实现Cloneable?

java - 使用 TITAN DB 手动安装 gremlin 服务器

sql-server-2008 - 表格向导中的 Report builder 3.0 样式

具有 Fluent 界面的 C++ Builder 模式

java - 为什么我的查询或 jpa 查询在 spring 中不起作用

.net - 我可以在 ironpython 中使用命名参数和可选参数吗

python - 如何在默认为类级别值的 Python 方法中使用命名参数?

java - 如何检查用户输入的日期是否大于java中当前日期的32天

java - 如何在一个类中操作另一个类中的数组?