簡體   English   中英

java.util.logging Java 8中的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM