gpt4 book ai didi

用于防御性编码的 Wil Shipley 的 `IsEmpty` 方法的 Java 实现

转载 作者:行者123 更新时间:2023-12-03 19:02:29 25 4
gpt4 key购买 nike

我是一名 Objective-C 人员,开始从事一个小型个人 Java 项目。在我的 Objective-C 项目中,我练习防御性编码并经常使用 Wil Shipley's IsEmpty(id thing) method在使用前检查 null 或空值:

static inline BOOL IsEmpty (id thing)
{
return thing == nil
|| ([thing respondsToSelector:@selector(length)] && [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)] && [(NSArray *)thing count] == 0);
}

我知道 Apache Commons 会做类似的事情(尽管在我看来,它只针对 String 对象),我自己也尝试过用 Java 实现类似的事情,但找不到调用方法当类在编译时未知时,对象上的 length()size() 方法。

我是不是想把一个方形的钉子塞进一个圆孔里?如果不是,经验丰富的 Java 开发人员将如何实现通用检查以确保范围广泛的对象不为空,并且在实现 .length().size 时不为空() 方法?

编辑:虽然一些答案侧重于实现等效的 isEmpty 方法(并且 pgreen2 的答案似乎确实有效),但 CodaFiThe Tosters 似乎是利用弱类型的 Objective-C 编码实践可能无法很好地转化为像 Java 这样的强类型范式(“方钉,圆孔”)。这并不是说哪种打字方法更可取。它们只是不同,需要不同的做法。

最佳答案

在我看来,这是 java 中非常糟糕的习惯。由于许多 instanceof 检查或 try/catch 递归,此方法将“非常繁重”。此外,如果集合为 NULL 或只是空的,上面的一些示例会导致您丢失信息。在 OBJ-C 中,这没有问题,因为你总是可以在 nil 指针上调用方法,但这对于 java 来说是非常不同的。我相信这可能会导致对算法进行适当控制的许多问题。例如你可以做这样的条件

if (Helper.isEmpty(someList) == true) {
someList = new ArrayList<>();
}

如果这是通过多个方法调用作为参数缓冲区传递下来的数组,这可能会导致很难找到的错误。

基本上,在进入您的方法时,您就知道会出现什么类型的对象,因此您可以立即进行检查,而无需进入冗长的类型检查方法,在几个 if 之后发现您从一开始就知道的参数类型。

关于用于防御性编码的 Wil Shipley 的 `IsEmpty` 方法的 Java 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com