编辑:我不担心会以错误的顺序被调用,因为这是通过使用多个接口(interface)来强制执行的,我只是担心终端方法会被调用。
我正在使用构建器模式在我们的系统中创建权限。我选择了一个构建器模式,因为安全性在我们的产品中非常重要(涉及未成年人,所以COPPA等),我认为必须具有可读性,并且认为可读性至关重要(即使用流利的样式)生成器模式,而不是具有6个值的单个函数)。
代码如下:
permissionManager.grantUser( userId ).permissionTo( Right.READ ).item( docId ).asOf( new Date() );
这些方法会填充一个私有(private)的支持bean,使终端方法(即asOf)将许可权提交给数据库;如果没有调用该方法,则不会发生任何事情。有时,开发人员会忘记调用终端方法,该方法不会导致编译器错误,并且在快速阅读/略读代码时很容易错过。
我该怎么做才能避免这个问题?我不希望返回需要获取保存的的Permission对象,因为这会引入更多噪音,并使权限代码更难以阅读,跟踪,跟踪和理解。
我已经考虑过将标记放在由terminal命令标记的支持上。然后,检查
finalize
方法中的标志,并在未持久化对象的情况下将其写入日志。 (我知道finalize
不能保证运行,但这是我能想到的最好的方法。) 最佳答案
现在有一个基于注释处理的编译器插件,如果不存在该方法,它将为您检查并抛出编译错误:Fluent API sentence end check。
您可以使用带有annotate your final method批注的 @End
,或者如果您不控制该类,则仍可以使用完全限定的方法名称来provide a text file,并进行检查。
然后Maven can check during compilation。
它仅在Java 8及更高版本中有效,因为它使用了在那里引入的新的编译器插件机制。