事务语义和状态完整性被认为是EJB3中的实现细节。 实现可以决定是使用bean还是容器管理的事务。 它可以决定容器管理事务的类型。 它可以决定它是满州还是无国籍。
然而,从逻辑上讲,这些都是重要的界面细节。 示例:(a)使用bean托管事务的bean无法使用容器管理事务调用bean。 (b)无状态bean无法调用满状态的bean。
当提供EJB3接口时,您不知道它需要什么样的事务语义。同样,你不知道它是满州还是无国籍。 您需要额外的实施细节。示例:文档。
在运行时,可以动态地实例化不同的bean和调用链。因此可能出现无效状态。现在 - 容器可以捕获这些情况;但为什么要等到运行时?
为什么事务语义和状态丰满度要求不属于接口?
答案 0 :(得分:1)
交易语义和 考虑到国家充实 EJB3中的实现细节。一个 实现可以决定是否 使用bean或容器管理 交易。它可以决定类型 容器管理事务。 它可以决定它是否满州 或无国籍。
我理解州管理这一点,从客户的角度来看确实很重要。
关于交易,这有点棘手。
bean-managed
或container-managed
)是实施细节(我不确定您的示例(a)) 。 required
,mandatory
,none
等。)。现在 - 容器可以捕获这些 的情况;但为什么要等到 运行
即使接口上存在所有内容,类型系统仍然不足以在编译类型中强制执行规则。
您无论如何都需要一个工具来根据适用语义来检查这些约束。 IDE可以解析注释,容器可以在部署模块时执行,更糟糕的是它在运行时失败。
为什么是事务语义和 国家充实要求不是一部分 接口?
java 接口仅包含有关组件正确用法的有限信息集,无论是类,bean还是API。大多数组件的总体契约比界面中公开的更复杂。
示例:
ContentHandler.characters()
:你怎么知道每个XML标签可以多次调用它? 我个人使用术语合同来引用完整的约束集。 接口仅从类型系统的角度给出了方法的签名。
如果您对该主题感兴趣,我建议您查看design by contract。很长一段时间以来,将组件之间的契约正式化的想法已经存在。
所以我的答案是:因为即使它是,你仍然需要更多的信息。