[英]Varargs in java.util.logging java 8
我們正在使用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網站上的java.util.logging.Logger中有多次使用Use argargs的請求。 JDK 5之后並沒有真正維護該API。 日志記錄已在JDK 8中針對Lambda表達式進行了更新,但日志記錄指南並未針對最佳實踐進行更新,只是java.util.logging.Logger中的幾個示例。
我創建了輔助
public static void log(Logger logger, Level level, Throwable t, String msg, Object... params)
您可能要使用如何使用拋出的參數記錄日志中的版本? 因為它將保留正確的類和方法名稱,因為調用者仍然負責發布日志記錄。
是否有充分的理由不使用
log(Level level, Throwable t, String msg, Object... params)
這可能是安全的補充。 Oracle進行了一項調查 ,很明顯,他們希望您將lambda或方法引用與采用Supplier<String>
並依賴提供支持var-args的java.util.Formatter的一種日志方法一起使用。
} catch (IllegalArgumentException iae) {
logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count));
}
甜甜的lambda語法超過蔬菜!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.