gpt4 book ai didi

java-8 - Consumer 封装 try catch 逻辑不起作用

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

我正在重构一些遗留代码,并且遇到了这个函数:

private static void parseOptionalValues(Product product, Input source) {
try {
product.setProductType(...some operation with source...);
} catch (IllegalArgumentException ignored) {}
try {
product.setMaterial(...some operation with source...);
} catch (IllegalArgumentException ignored) {}
try {
product.setUnitPricingBaseMeasure(...some operation with source...);
} catch (IllegalArgumentException ignored) {}
try {
product.setUnitPricingMeasure(...some operation with source...);
} catch(IllegalArgumentException ignored){}
}

我的常识告诉我,为了保持“不要重复自己”原则,我应该包装这个 try-catch 逻辑,所以我引入了这个更改:

private static void parseOptionalValues(Product product, Input source) {
setOptionalParameter(...some operation with source..., product::setProductType);
setOptionalParameter(...some operation with source..., product::setMaterial);
setOptionalParameter(...some operation with source..., product::setUnitPricingBaseMeasure);
setOptionalParameter(...some operation with source..., product::setUnitPricingMeasure);
}

private static <T> void setOptionalParameter(T value, Consumer<T> consumer) {
try {
consumer.accept(value);
} catch (IllegalArgumentException ignored) {}
}

我正在运行一些单元测试和调试,但代码的行为与以前不同,因为 IllegalArgumentException 未被捕获而是引发,因此程序失败。

关于如何解决这个问题,将 try-catch 逻辑封装在一个地方有什么想法吗?

最佳答案

我认为问题可能是获取要传递给 setter 的参数的代码引发的异常。因此,一种可能的方法是使用 Supplier 使这部分代码变得惰性,然后在 上调用 .get() try/catch block 内的 >Supplier(以及调用 Consumer):

private static <T> void setOptionalParameter(
Supplier<? extends T> supplier,
Consumer<? super T> consumer) {

try {
consumer.accept(supplier.get());
} catch (IllegalArgumentException ignored) {
}
}

您可以按如下方式调用该方法:

setOptionalParameter(() -> ...some operation with source..., product::setProductType);

请注意,我改进了您的方法的签名,以便它现在分别接受 SupplierConsumer 的更广泛的通用子类型和父类(super class)型。

<小时/>

编辑:根据评论,上述方法可能不够灵活,即如果该方法接受多个参数等。在这种情况下,最好使用 可运行实例:

private static void setOptionalParameter(Runnable action) {

try {
action.run();
} catch (IllegalArgumentException ignored) {
}
}

调用现在将变为:

setOptionalParameter(() -> {
ProductType productType = ...some operation with source...;
Material material = ...some operation with source...;

product.doSomethingWith2Args(productType, material);
});

关于java-8 - Consumer 封装 try catch 逻辑不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225163/

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