gpt4 book ai didi

java - @FunctionalInterface 在分阶段构建器中的好处

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:36 24 4
gpt4 key购买 nike

简介

在搜索网络时,我偶然发现了 Benoit Tellier 的博客文章,Next level Java 8 staged builders ,他在其中分享了针对某些用例的分阶段构建器模式的变体。

我注意到阶段用 @FunctionalInterface 注释。这是他的帖子中的一个示例(没有技巧):

public static class MailboxCreatedBuilder {
@FunctionalInterface
public interface RequireUser {
RequireSessionId user(User user);
}

@FunctionalInterface
public interface RequireSessionId {
RequireMailboxId sessionId(MailboxSession.SessionId sessionId);
}

@FunctionalInterface
public interface RequireMailboxId {
FinalStage mailboxId(MailboxId mailboxId);
}

public static class FinalStage {
...
...
}

public static RequireUser builder() {
return user -> sessionId -> mailboxId -> new FinalStage(user, sessionId, mailboxId);
}
}

此注释将一个阶段可以拥有的方法数量限制为一个,加上具有默认实现的重载方法。无论如何,每个阶段处理一个属性可能是个好主意,但对于我当前的需求,我希望在单独的类中有多个方法和实现。

问题

这让我想知道:我的阶段是否也应该有 @FunctionalInterface?这样的构建器有什么好处/如何在函数式风格编程中使用?

编辑

根据这个问题下面的评论,事实证明我真正想知道的是让阶段遵守功能接口(interface)契约(无论可选注释如何)的需求/好处是什么。

最佳答案

单一方法所需的阶段类型用于强制调用者提供所需的值,由编译器强制执行(它也强制执行特定的顺序)。 FinalStage 类随后具有所有可选方法。

在这种情况下,在调用 builder() 之后,您必须调用 user(...),然后是 sessionId( ...),然后是 mailboxId(...),最后是 FinalStage 中定义的任何可选方法:

MailboxCreatedBuilder.builder()
.user(...)
.sessionId(...)
.mailboxId(...)
...
.build();

关于java - @FunctionalInterface 在分阶段构建器中的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57272313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com