gpt4 book ai didi

java - java.util.logging Java 8中的变量

转载 作者:行者123 更新时间:2023-12-01 22:09:56 24 4
gpt4 key购买 nike

我们正在使用java.util.logging

void log(Level level, Throwable thrown, Supplier<String> msgSupplier) 


还有其他一些方便的方法,例如

logp(Level level, String sourceClass, String sourceMethod,
String msg, Object params[])


但是没有varargs方法。怎么会?这看起来像是将来的增强功能,还是有充分的理由不提供以下内容:

    public void log( Level level, Throwable t, String msg, Object... params) {
// throw new RuntimeException("No yet impl");
if (!isLoggable(level)) {
return;
}
LogRecord lr = new LogRecord(level, msg);
lr.setParameters(params);
if (t != null) {
lr.setThrown(t);
}
doLog(lr);
}


我创建了助手:

    public static void log(Logger logger, Level level, Throwable t, String msg, Object... params) {
// throw new RuntimeException("No yet impl");
if (!logger.isLoggable(level)) {
return;
}
LogRecord lr = new LogRecord(level, msg);
lr.setParameters(params);
if (t != null) {
lr.setThrown(t);
}
logger.log(lr);
}


很想调用doLog而不是在最后一行登录,但是doLog是一个私人帮手!不知道为什么,因为我没有办法设置捆绑包等-希望它是

public void doLog(LogRecord lr)而不是private。

无论如何,对于我们来说,以下方法可以做同样的事情,以便我们可以使用自己的varargs方法?

// resource bundle and then call "void log(LogRecord)".
private void doLog(LogRecord lr) {
lr.setLoggerName(name);
final LoggerBundle lb = getEffectiveLoggerBundle();
final ResourceBundle bundle = lb.userBundle;
final String ebname = lb.resourceBundleName;
if (ebname != null && bundle != null) {
lr.setResourceBundleName(ebname);
lr.setResourceBundle(bundle);
}
log(lr);
}

最佳答案

但是没有varargs方法。怎么会?这看起来像是未来的增强功能吗?


多年来,OpenJDK站点上有许多对Use varargs in java.util.logging.Logger的请求。该API并不是真正的maintained after JDK 5。 JDK 8中针对Lambda Expressions的日志记录已更新,但是针对最佳实践的日志记录指南并未进行更新,只是java.util.logging.Logger中的几个示例。


我创建了助手public static void log(Logger logger, Level level, Throwable t, String msg, Object... params)


您可能要使用How can I log with params with a thrown?中的版本,因为它会保留正确的类和方法名称,因为调用者仍然负责发布日志记录。


是否有充分的理由不使用log(Level level, Throwable t, String msg, Object... params)之类的东西


这可能是安全的补充。 Oracle ran a survey显然,他们希望您将lambda或方法引用与采用Supplier<String>并依赖java.util.Formatter提供var-args支持的log方法之一一起使用。

} catch (IllegalArgumentException iae) {
logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count));
}


甜甜的lambda语法超过蔬菜!

关于java - java.util.logging Java 8中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58667243/

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