首页 > Java > java教程 > 正文

使用 Argparse4j 在 Java 中接收 Duration 类型参数

心靈之曲
发布: 2025-10-26 11:50:34
原创
573人浏览过

使用 argparse4j 在 java 中接收 duration 类型参数

本文介绍了如何使用 `net.sourceforge.argparse4j` 库在 Java 命令行程序中接收 `java.time.Duration` 类型的参数。由于 `Duration` 不是原始数据类型,`Argparse4j` 无法直接支持。本文将提供两种解决方案:使用 `valueOf` 工厂方法模式和使用 `convert` 适配器模式,以便将 ISO-8601 格式的字符串转换为 `Duration` 对象。

net.sourceforge.argparse4j 是一个强大的 Java 命令行参数解析库。虽然它本身并不直接支持 java.time 包中的类,但它提供了灵活的机制来处理自定义类型。针对 Duration 类型,我们可以利用其提供的扩展点,通过自定义转换逻辑来实现参数解析。

使用 valueOf 工厂方法模式

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免费学习笔记(深入)”;

  1. IsoDuration 类:这是一个静态内部类,包含一个静态的 valueOf 方法。
  2. valueOf(String isoFormat) 方法:该方法接收一个 ISO-8601 格式的字符串,并使用 Duration.parse() 方法将其解析为 Duration 对象。如果解析失败,则抛出一个 ArgumentParserException 异常。
  3. main 方法:
    • 创建 ArgumentParser 对象。
    • 使用 addArgument("duration").type(IsoDuration.class) 添加一个名为 "duration" 的参数,并指定其类型为 IsoDuration.class。 这告诉 Argparse4j 使用 IsoDuration.valueOf() 方法来转换参数值。
    • 解析命令行参数。
    • 捕获 ArgumentParserException 异常并处理错误。
    • 打印解析后的结果。

运行示例:

java DurationParserWithValueOf PT1H30M
登录后复制

输出:

Namespace(duration=PT1H30M)
Duration: PT1H30M
登录后复制

使用 convert 适配器模式

适配器模式允许您将一个类的接口转换成客户希望的另外一个接口。我们可以创建一个实现了 ArgumentType<Duration> 接口的类,并在其 convert 方法中实现将 ISO-8601 格式的字符串转换为 Duration 对象的逻辑。

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中22
查看详情 百度文心百中
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免费学习笔记(深入)”;

  1. IsoDurationArgument 类:这是一个实现了 ArgumentType<Duration> 接口的类。
  2. convert(ArgumentParser parser, Argument arg, String value) 方法:该方法接收 ArgumentParser 对象、Argument 对象和一个字符串值。它使用 Duration.parse() 方法将字符串值解析为 Duration 对象。如果解析失败,则抛出一个 ArgumentParserException 异常。
  3. main 方法:
    • 创建 ArgumentParser 对象。
    • 使用 addArgument("duration").type(new IsoDurationArgument()) 添加一个名为 "duration" 的参数,并指定其类型为 IsoDurationArgument 的一个实例。 这告诉 Argparse4j 使用 IsoDurationArgument 实例的 convert 方法来转换参数值。
    • 解析命令行参数。
    • 捕获 ArgumentParserException 异常并处理错误。
    • 打印解析后的结果。

运行示例:

java DurationParserWithConvert PT1H30M
登录后复制

输出:

Namespace(duration=PT1H30M)
Duration: PT1H30M
登录后复制

总结

本文介绍了两种使用 net.sourceforge.argparse4j 库在 Java 命令行程序中接收 java.time.Duration 类型参数的方法。valueOf 工厂方法模式和 convert 适配器模式都提供了灵活的方式来处理自定义类型。选择哪种方法取决于您的具体需求和代码风格。

注意事项:

  • 确保输入的字符串符合 ISO-8601 格式,否则 Duration.parse() 方法会抛出 DateTimeParseException 异常。
  • 在 valueOf 方法和 convert 方法中,都需要捕获 DateTimeParseException 异常,并将其转换为 ArgumentParserException 异常,以便 Argparse4j 能够正确处理错误。
  • 在使用 Argparse4j 时,需要添加相应的依赖。Maven 依赖如下:
<dependency>
    <groupId>net.sourceforge.argparse4j</groupId>
    <artifactId>argparse4j</artifactId>
    <version>0.9.0</version>
</dependency>
登录后复制

以上就是使用 Argparse4j 在 Java 中接收 Duration 类型参数的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号