Java中是否有一项功能可以确保调用该方法

时间:2017-08-31 08:40:15

标签: java builder

我使用类似于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));

但在这种情况下,我失去了流动性。

2 个答案:

答案 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对象。