设计以下交互式 API 的替代方法是啥?
Posted
技术标签:
【中文标题】设计以下交互式 API 的替代方法是啥?【英文标题】:What are the alternatives ways of desiging following interactive API?设计以下交互式 API 的替代方法是什么? 【发布时间】:2021-10-26 04:11:14 【问题描述】:界面的一个简单版本是:
public interface IAPI
void initialize(int processId) throws APIException;
APIResult process(IData data) throws APIException;
void finalize();
Finalize 方法创建一份关于已处理数据的摘要报告(对我来说非常重要的信息),但对客户来说并不重要。
API 的使用方式如下:
IAPI api = new API();
api.initialize(18);
loop
IData data = …..getData!
APIResult res = api.process(data);
// do something with result.
// Finalize - We want to enforce the finalize call
api.finalize();
我需要一个解决方案来确保在他们处理完数据后调用 finalize 方法。该解决方案必须足够灵活,以让用户定义他们希望如何处理异常,处理他们想要的尽可能多的数据。提前感谢您提供任何替代方案。
【问题讨论】:
我会避免依赖调用finalize()
方法的客户端。它根本不可靠,尤其是在运行process()
时满足了他们的担忧。我的意思是,开发人员会随意不关闭数据库连接对象...解决此问题的一种方法是汇总您的数据并将其缓冲为process()
运行。通过这种方式,您可以实时获取统计信息,也可以使用计划任务从队列中提取缓冲数据或类似的方式来计算统计信息。
【参考方案1】:
我会这样做:
import java.util.function.Function;
public class Test
static class APIException extends Exception
static class APIResult
static class IData
// This is the public API
interface IAPI
<T> T withIDataProcessor(Function<IDataProcessor,T> process) throws APIException;
interface IDataProcessor
APIResult process(IData idata);
// only the DefaultIAPI class knows about this
interface PrivateIAPI
void initialize(int processId) throws APIException;
APIResult process(IData data) throws APIException;
void finalize();
static class DefaultIAPI implements IAPI
private PrivateIAPI privateIAPI;
@Override
public <T> T withIDataProcessor(Function<IDataProcessor, T> process) throws APIException
try
privateIAPI.initialize(5);
return process.apply(idata ->
try
return privateIAPI.process(idata);
catch (APIException e)
// handle this in some way
throw new RuntimeException(e);
);
finally
privateIAPI.finalize();
public static void main(String[] args)
IAPI iapi = new DefaultIAPI();
int result = iapi.withIDataProcessor(idataProcessor ->
while (idataProcessor.process(...getData()))
...
return n;
);
(注意main
方法不能编译,异常处理需要多思考)
【讨论】:
以上是关于设计以下交互式 API 的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章