进程原语和线程原语是啥意思_亲爱的API设计人员。 您确定要返回原语吗?

进程原语和线程原语是啥意思

有些API是一成不变的。 例如,JDK。 或公共API,例如数据库和数据库客户端(例如JDBC)之间的API。

这使得设计这样的API变得相当困难,因为在发布API之前需要做很多思考。 这意味着在设计API时采取防御措施是一个不错的选择。

一种防御性API设计策略是始终使用参数对象和返回对象。 我们已经在之前写过关于参数对象的博客 。 让我们看一下不使用返回对象的API,以及为什么如此糟糕:

数据库可更新语句

从数据库中获取数据时,我们获得了一种方便的API类型JDBC ResultSet 。 Java以外的其他语言也具有类似的类型来对数据库结果进行建模。 虽然ResultSet主要为一组元组建模,但它还包含各种其他有用的功能,例如ResultSet.getMetaData()ResultSet.getWarnings() ,它们是巧妙的后门,用于通过ResultSet传递任意的其他信息。

这些结果类型的最好之处在于它们可以向后兼容地扩展。 无需修改即可将新方法和功能添加到这些结果类型:

  • 任何现有合同
  • 任何现有的客户端代码

唯一可能会中断的是JDBC驱动程序,但是由于Java 8,JDBC 4.2和默认方法 ,这也已经成为过去。

在数据库中调用更新语句时,情况看起来大不相同:

int count = stmt.executeUpdate();

count数值。 而已? 触发器生成的信息如何处理? 那警告呢(我知道,它们可以从语句中获得。该调用已对其进行了修改)?

有趣的是,这个int count数值似乎已经困扰了一些人足够长的时间,以至于该方法实际上已经在JDBC 4.2中被重载:

long count = stmt.executeLargeUpdate();

嗯...

我说的是“事实上的重载”,因为从技术上讲它实际上是重载,但是因为Java不支持按返回类型进行重载,所以名称也被更改了。 ( 嗯,JVM确实支持它,但不支持语言 )。

当您阅读executeUpdate()方法的Javadoc时,您会注意到在此原始值中编码了不同的状态:

返回:(1)SQL数据操作语言(DML)语句的行数,或者(2)0,不返回任何内容SQL语句

而且,有一个类似的方法叫getUpdateCount() ,它将更复杂的状态编码为一个原语:

当前结果作为更新计数; 如果当前结果是一个ResultSet对象或没有更多结果,则为-1

嗯...

似乎还不够糟糕,对于上述限制,有一个非常特殊的解决方法是由MySQL数据库实现的,该数据库对UPSERT语句的不同状态进行了如下编码:

使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则为2。 – 看这里

如果性能无关紧要,请始终返回引用类型!

这真的很糟糕。 该呼叫针对数据库通过网络运行。 本质上是缓慢的。 如果由于executeUpdate()而具有UpdateResult数据类型,则不会丢失任何内容。 一个不同的示例是String.indexOf(...) ,出于性能原因,该String.indexOf(...)将“未找到”编码为-1

该错误不仅发生在这些早于面向对象编程的旧API中。 当许多有用的方法结果中首先想到的是原始值(或更糟糕的是:void)时,在许多应用程序的较新API中再次重复该操作。

如果您正在编写流利的API(例如Java 8 Stream API或jOOQ) ,那么这将不是问题,因为API总是返回类型本身,以便允许用户链接方法调用。

在其他情况下,返回类型非常明确,因为您没有实现任何副作用操作。 但是,如果这样做,请再考虑是否真的要只返回原始值。 如果必须长时间维护API,几年后您可能会后悔。

继续阅读有关API设计的信息

翻译自: https://www.javacodegeeks.com/2016/02/dear-api-designer-sure-want-return-primitive.html

进程原语和线程原语是啥意思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值