
本文介绍了如何使用 `net.sourceforge.argparse4j` 库在 Java 命令行程序中接收 `java.time.Duration` 类型的参数。由于 `Duration` 不是原始数据类型,`Argparse4j` 无法直接支持。本文将提供两种解决方案:使用 `valueOf` 工厂方法模式和使用 `convert` 适配器模式,以便将 ISO-8601 格式的字符串转换为 `Duration` 对象。
net.sourceforge.argparse4j 是一个强大的 Java 命令行参数解析库。虽然它本身并不直接支持 java.time 包中的类,但它提供了灵活的机制来处理自定义类型。针对 Duration 类型,我们可以利用其提供的扩展点,通过自定义转换逻辑来实现参数解析。
valueOf 方法是一种常见的工厂方法模式,用于从字符串创建对象。我们可以创建一个包装类,该类包含一个 valueOf 方法,该方法负责将 ISO-8601 格式的字符串解析为 Duration 对象。
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import java.time.Duration;
import java.time.format.DateTimeParseException;
import net.sourceforge.argparse4j.inf.Namespace;
public class DurationParserWithValueOf {
private static class IsoDuration {
public static Duration valueOf(String isoFormat) throws ArgumentParserException {
try {
return Duration.parse(isoFormat);
} catch (DateTimeParseException e) {
throw new ArgumentParserException(e, parser);
}
}
}
private static ArgumentParser parser; // Make parser accessible
public static void main(String[] args) {
parser = ArgumentParsers.newFor("prog").build();
parser.addArgument("duration").type(IsoDuration.class);
try {
Namespace res = parser.parseArgs(args);
System.out.println(res);
System.out.println("Duration: " + res.get("duration"));
} catch (ArgumentParserException e) {
parser.handleError(e);
}
}
}代码解释:
立即学习“Java免费学习笔记(深入)”;
运行示例:
java DurationParserWithValueOf PT1H30M
输出:
Namespace(duration=PT1H30M) Duration: PT1H30M
适配器模式允许您将一个类的接口转换成客户希望的另外一个接口。我们可以创建一个实现了 ArgumentType<Duration> 接口的类,并在其 convert 方法中实现将 ISO-8601 格式的字符串转换为 Duration 对象的逻辑。
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.Argument;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.ArgumentType;
import java.time.Duration;
import java.time.format.DateTimeParseException;
import net.sourceforge.argparse4j.inf.Namespace;
public class DurationParserWithConvert {
private static class IsoDurationArgument implements ArgumentType<Duration> {
@Override
public Duration convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {
try {
return Duration.parse(value);
} catch (DateTimeParseException e) {
throw new ArgumentParserException(e, parser);
}
}
}
public static void main(String[] args) {
ArgumentParser parser = ArgumentParsers.newFor("prog").build();
parser.addArgument("duration").type(new IsoDurationArgument());
try {
Namespace res = parser.parseArgs(args);
System.out.println(res);
System.out.println("Duration: " + res.get("duration"));
} catch (ArgumentParserException e) {
parser.handleError(e);
}
}
}代码解释:
立即学习“Java免费学习笔记(深入)”;
运行示例:
java DurationParserWithConvert PT1H30M
输出:
Namespace(duration=PT1H30M) Duration: PT1H30M
本文介绍了两种使用 net.sourceforge.argparse4j 库在 Java 命令行程序中接收 java.time.Duration 类型参数的方法。valueOf 工厂方法模式和 convert 适配器模式都提供了灵活的方式来处理自定义类型。选择哪种方法取决于您的具体需求和代码风格。
注意事项:
<dependency>
<groupId>net.sourceforge.argparse4j</groupId>
<artifactId>argparse4j</artifactId>
<version>0.9.0</version>
</dependency>以上就是使用 Argparse4j 在 Java 中接收 Duration 类型参数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号