我想使用类似这样的方法来检查一些条件,但问题是我需要知道哪个条件失败并记录异常,这种方法确实可以实现,但依赖于知道代码中检查的位置,这并不理想,有没有其他更好的方法来做到这一点?(不会使调用函数的时间更长)第一个
j7dteeu81#
您可能会对Decorator design patter感兴趣。也就是说,你可以创建一个修饰你选择的函数接口的实现。看起来Predicate比BooleanSupplier更适合你,因此下面的例子说明了一个抛出 predicate ,它期望一个 predicate ,目标异常的产生器,消息和记录器作为参数,它的test()实现委托给 Package predicate 来评估条件。trowing Predicate的示例可用于需要Predicate的任何地方。
Predicate
BooleanSupplier
test()
public class ThrowingLoggPredicate<T> implements Predicate<T> { private Predicate<T> predicate; private Function<String, RuntimeException> exceptionFactory; private String messageShort; private String format; private Logger logger; public ThrowingLoggPredicate(Predicate<T> predicate, Function<String, RuntimeException> exceptionFactory, String messageShort, String format, Logger logger) { this.predicate = predicate; this.exceptionFactory = exceptionFactory; this.messageShort = messageShort; this.format = format; this.logger = logger; } public boolean test(T t) { if (!predicate.test(t)) { RuntimeException e = exceptionFactory.apply(messageShort); String messageVerbose = String.format(format, t); logger.log(Level.ERROR, messageVerbose, e); throw e; } return true; } public static <T> boolean allMatch(Collection<Predicate<T>> predicates, T t) { return predicates.stream().allMatch(p -> p.test(t)); } }
1条答案
按热度按时间j7dteeu81#
您可能会对Decorator design patter感兴趣。
也就是说,你可以创建一个修饰你选择的函数接口的实现。看起来
Predicate
比BooleanSupplier
更适合你,因此下面的例子说明了一个抛出 predicate ,它期望一个 predicate ,目标异常的产生器,消息和记录器作为参数,它的test()
实现委托给 Package predicate 来评估条件。trowing Predicate的示例可用于需要Predicate的任何地方。