我使用类似于builder / fluid API的模式来配置一些计时服务。我知道它不是一个典型的建造者,但它看起来非常好,我想保持这种风格。
看起来像:
Action someAction = getAction();
someAction.shouldRunEvery(5).seconds();
最后一个动词可以是秒(),分钟(),毫秒()等。 链中最后一个方法中的代码实际上将更改写入存储库。 典型的错误(尽管我知道内部结构,我已经不止一次)但正在使用这样的方法:
someAction.shouldRunEvery(10);
有没有办法确保在对象上调用接口的功能? 我可以使用java 8/9的任何功能和/或其他库。
增加1: 如何生成流体API:
interface Action{ ActionUnit shouldRunEvery (int time);}
interface ActionUnit { void seconds(); void minutes(); ... etc.}
增加2: 我试图调查异常情况,但无法弄清楚如何将它们拼接在一起并保持整洁。
增加3: 可能最好的答案是将API更改为以下内容:
someAction.shouldRunEvery(seconds(5));
但在这种情况下,我失去了流动性。
答案 0 :(得分:3)
在Java中没有好办法,但它仍然有可能。您可以在Generator of Turing Machines that run on Java generic types找到“安全生成器”示例。 此示例使用Java泛型完成的事实。你可以阅读原创文章(仅限俄语Тьюринг-полнота Generic типов Java)
但我担心这对现实生活来说太可怕了。
答案 1 :(得分:2)
你可以强制调用其中一个时间单位方法,让它们返回一个Action,让getAction()
不返回Action,而是返回一个新生对象(例如'PreAction'):
PreAction someAction = getPreAction();
接口看起来像这样:
interface PreAction{ ActionUnit shouldRunEvery (int time);}
interface ActionUnit { Action seconds(); Action minutes(); ... etc.}
现在,当您忘记时间单位时,您最终会得到一个不能作为动作的PreAction对象。