Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否应该允许实现类有可能破坏API,如果不这样做可能导致负面影响_Java_Concurrency_Api Design - Fatal编程技术网

Java 我是否应该允许实现类有可能破坏API,如果不这样做可能导致负面影响

Java 我是否应该允许实现类有可能破坏API,如果不这样做可能导致负面影响,java,concurrency,api-design,Java,Concurrency,Api Design,我正在使用支持ScheduledExecutorService为调度器开发API。基本设计是向调度器注册一个提供程序实例,调度器为每个注册的提供程序维护ScheduledFuture。提供程序本质上是一个可运行的程序,它知道如何检索触发任务 我面临的问题是,当取消预定的未来时,该怎么办。取消ScheduledFuture的API采用布尔参数,允许中断正在触发的提供程序。我认为,在终止提供程序时,将其与该参数的值一起通知提供程序是有意义的,这样它就可以进行任何必要的清理 但是,如果您在取消其Sch

我正在使用支持ScheduledExecutorService为调度器开发API。基本设计是向调度器注册一个提供程序实例,调度器为每个注册的提供程序维护ScheduledFuture。提供程序本质上是一个可运行的程序,它知道如何检索触发任务

我面临的问题是,当取消预定的未来时,该怎么办。取消ScheduledFuture的API采用布尔参数,允许中断正在触发的提供程序。我认为,在终止提供程序时,将其与该参数的值一起通知提供程序是有意义的,这样它就可以进行任何必要的清理

但是,如果您在取消其ScheduledFuture之前通知提供程序实例它将被终止,则无论该参数的值如何,提供程序实例都有可能通过阻塞中断API,直到完成执行为止

另一方面,如果调用cancel时将该值设置为true,并且ScheduledFuture在让提供程序实例知道它正在被终止之前被取消,那么它可能会失去对其执行任何操作的机会

注意:由于项目要求,我不能使用石英。否则我就用它了。请不要告诉我使用替代框架,因为我的问题是关于API设计的


有什么想法吗

也许我误解了,但你不是想得太多了吗


如果您想取消将来要运行的任务,而提供商尚未开始执行该工作,那么它为什么需要清理任何东西?

也许我在这里有误解,但您不是想得太多了吗


如果您想取消将来要运行的任务,而提供商还没有开始执行该工作,那么它为什么需要清理任何东西呢?

我强烈建议您自己使用而不是编写此类服务。它支持(除其他许多功能外)。

我强烈建议您自己使用而不是编写此类服务。它支持(除其他许多功能外)。

从技术上讲,这不更像是一个SPI而不是一个API吗?我认为我们可以期望实现者因此得到更多,所以我会通知他们关闭。作为一种避险,我还要确保通知在默认情况下不做任何事情。如果使用侦听器,请不要自动注册此事件的提供程序。如果总是调用某个方法,请提供一个对该调用不做任何操作的抽象基类

以下是我期待更多SPI实现者的理由:

如果我想安排任务,我使用ScheduledExecutor API。作为一名应用程序程序员,我有一个我想要满足的用例,我尽量不去关心如何完成它的内部工作。因此,我认为API的编码应该非常防御性


提供者显然是一个SPI。类名“Provider”是一个很大的提示。它确切地知道如何使用它,并且只涉及低级细节。我之所以具体实现它,是因为默认实现不符合我的要求。我想要最大程度的灵活性,即使是以牺牲我更多的努力为代价。不应该期望应用程序程序员编写一个。不过,他们可能会选择一种实现而不是另一种实现。

从技术上讲,这不更像是一种SPI而不是API吗?我认为我们可以期望实现者因此得到更多,所以我会通知他们关闭。作为一种避险,我还要确保通知在默认情况下不做任何事情。如果使用侦听器,请不要自动注册此事件的提供程序。如果总是调用某个方法,请提供一个对该调用不做任何操作的抽象基类

以下是我期待更多SPI实现者的理由:

如果我想安排任务,我使用ScheduledExecutor API。作为一名应用程序程序员,我有一个我想要满足的用例,我尽量不去关心如何完成它的内部工作。因此,我认为API的编码应该非常防御性


提供者显然是一个SPI。类名“Provider”是一个很大的提示。它确切地知道如何使用它,并且只涉及低级细节。我之所以具体实现它,是因为默认实现不符合我的要求。我想要最大程度的灵活性,即使是以牺牲我更多的努力为代价。不应该期望应用程序程序员编写一个。不过,他们可能会选择一种实现而不是另一种实现。

确定您不想只使用Quartz?为什么不呢?你应该考虑写自己的替代品,除非你的目的是学习如何。这不是一个选择的要求,否则我只是使用石英。我不打算推动这个问题-我真的好奇-但什么是在要求,不允许使用石英?是不是它不能满足你所有的需求?还是别的什么?我这样问是因为即使你不能使用这个库,你也可以模仿它自己的API设计选择。除非那些要求说“不要使用石英”,否则你也欠你的客户一个人情。你确定不想只使用石英吗?为什么不呢?你应该考虑写自己的替代品,除非你的目的是学习如何。这不是一个选择的要求,否则我只是使用石英。我不打算推动这个问题-我真的好奇-但什么是在要求,不允许使用石英?是不是它不能满足你所有的需求?还是别的什么?我这样问是因为即使你不能使用这个库,你也可以模仿它自己的API设计选择