【问题标题】:Why is proxying deprecated?为什么不推荐使用代理?
【发布时间】:2014-06-19 17:14:18
【问题描述】:

This question 关于如何扩展 Scala 集合让我找到了this answer,它从SetProxy 扩展而来,而不是Set。但是SetProxy 已经被弃用了!文档说“(自 2.11.0 版起)由于缺乏使用和编译器级别的支持,不推荐使用代理。”

为什么代理没有得到使用和编译器的支持? Scala 是否提供了更好的技术来完成同样的事情?是不是发现有什么致命的缺陷?

【问题讨论】:

    标签: scala proxy-classes


    【解决方案1】:

    不推荐使用代理,因为它很脆弱。代理应该将所有调用转发回某个其他实现。但是,如果您向 Set 层次结构添加一个新方法会怎样——有人会记得将它添加到 SetProxy 并确保它指向它应该指向的位置吗?

    在实践中,没有很好的方法来验证代理是否真正正常运行。因此,我们决定完全不拥有该功能,而不是拥有看起来可以工作但实际上不再有用的东西。编译器对代理的支持可能很容易维护健壮的代理,但手动方法不够健壮。

    【讨论】:

    • 哎呀!我没有意识到代理类是手动维护的。我认为他们必须通过一些巧妙的转发机制来工作。 Scala 是否提供了其他方式来完成代理的工作,就像我问的 here 一样?宏,也许?
    • 扩展收藏并不是一件容易的事。您可能希望在新集合上映射以返回相同类型的集合,但为此,除了新类之外,您还需要 CanBuildFroms 和可能的 YourNewSetLike。代理不是黑盒宏可以帮助您的,但其他人可能可以。编译器插件是更可行的方法,但集合层次结构使用的功能比编译器在尝试寻找自动解决方案时可以合理预期的要多。我不确定有什么好的解决方案。
    猜你喜欢
    • 2016-02-23
    • 2017-11-04
    • 2011-10-22
    • 2011-04-11
    • 2021-10-12
    • 2012-12-07
    • 2012-05-16
    • 2020-06-29
    • 2014-08-11
    相关资源
    最近更新 更多