Java 具有可选参数列表的函数
Java Function With Optional Listed Parameters
我正在 Java 应用程序中重写日志记录 class。我们拥有的主要日志记录功能之一使用对象来确定输出的位置。我想要做的是摆脱那个对象,并将输出流直接列在参数中作为可选参数,如下所示:
Logger.log("Log String Here", stdout, trace, debug, device1);
其中stdout、trace、debug是可选参数,可以不存在,也可以以任意顺序存在。例如,也可以这样写:
Logger.log("Log String Here", debug, trace, deviceTrace);
这可以在 Java 8 中使用 Optional class 完成,还是我必须将输出流组合成一个字符串或数组?
Java 8 Optional
与您要查找的内容无关。 Optional
是一些 class 实例的包装器,它可以为您节省一些空检查。如果你在你的方法中使用 Optional
参数,你仍然必须在每次调用你的 log
方法时传递所有这些参数(即使其中一些是空的)。
如果您所有的可选参数都有一个共同的基础 class 或接口,您可以使用可变参数。
例如:
public static void log (String message, OutputStream... output) {
}
但是,您不能按任何顺序传递它们。例如,你必须决定output[0]
的作用是什么,而output[1]
只有在output[0]
也通过的情况下才能通过。
另一种方法是使用具有不同参数组合的多个重载方法。
我正在 Java 应用程序中重写日志记录 class。我们拥有的主要日志记录功能之一使用对象来确定输出的位置。我想要做的是摆脱那个对象,并将输出流直接列在参数中作为可选参数,如下所示:
Logger.log("Log String Here", stdout, trace, debug, device1);
其中stdout、trace、debug是可选参数,可以不存在,也可以以任意顺序存在。例如,也可以这样写:
Logger.log("Log String Here", debug, trace, deviceTrace);
这可以在 Java 8 中使用 Optional class 完成,还是我必须将输出流组合成一个字符串或数组?
Java 8 Optional
与您要查找的内容无关。 Optional
是一些 class 实例的包装器,它可以为您节省一些空检查。如果你在你的方法中使用 Optional
参数,你仍然必须在每次调用你的 log
方法时传递所有这些参数(即使其中一些是空的)。
如果您所有的可选参数都有一个共同的基础 class 或接口,您可以使用可变参数。
例如:
public static void log (String message, OutputStream... output) {
}
但是,您不能按任何顺序传递它们。例如,你必须决定output[0]
的作用是什么,而output[1]
只有在output[0]
也通过的情况下才能通过。
另一种方法是使用具有不同参数组合的多个重载方法。