首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接受工期参数作为java中的命令行参数

接受工期参数作为java中的命令行参数
EN

Stack Overflow用户
提问于 2022-11-24 18:28:50
回答 2查看 37关注 0票数 1

我希望使用java.time.Duration在java中接受net.sourceforge.argparse4j.ArgumentParsers数据类型的输入。但是,由于工期是一种非原始数据类型,因此不支持将其作为参数之一传递。除了以ISO-8601格式将其指定为字符串并使用Duration.parse() (https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-)将其转换为持续时间类型之外,是否有更好或直接的方法在java中接受工期作为参数?

EN

回答 2

Stack Overflow用户

发布于 2022-11-24 18:59:11

似乎ArgParse4j对Java时类没有现成的支持,但它提供了两种可能有用的模式:

valueOf工厂方法创建模式

通常,T valueOf(String text) factory-method是一种非常惯用的Java文本解析创建模式。

如果类T没有T valueOf(String)方法,则只需对其进行扩展并使用该方法对其进行修饰。

不幸的是,不可变的java.time类型(如java.time.Duration )并不适合扩展或子类型--它们是final类。因此,我部分同意GreyBeardedGeeks's answer的观点:不,没有直接接受Duration论点的方法。

但是间接的方法是定义一个包装类,它实现了valueOf委托给Duration.parse(CharSequence text)

代码语言:javascript
复制
private static class IsoDuration {

    public static Duration valueOf(String isoFormat) throws ArgumentParserException {
        try {
            return Duration.parse(isoFormat);  // the method you found
        } catch (DateTimeParseException  e) {
            throw new ArgumentParserException(e, parser);
        }
    }
}

public static void main(String[] args) {
    ArgumentParser parser = ArgumentParsers.newFor("prog").build();
    parser.addArgument("duration").type(IsoDuration.class);
    try {
        System.out.println(parser.parseArgs(args));
    } catch (ArgumentParserException e) {
        parser.handleError(e);
    }
}

带有convert实例的适配器模式-方法

还可以使用自定义类型作为转换器或adapter,该类实现ArgumentType<Duration>并使用Duration.parse(CharSequence text)解析ISO-8601字符串并转换为所需的持续时间类型:

代码语言:javascript
复制
private static class IsoDurationArgument implements ArgumentType<Duration> {

    @Override
    public Duration convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {
        try {
            return Duration.parse(value);  // the method you found
        } 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 {
        System.out.println(parser.parseArgs(args));
    } catch (ArgumentParserException e) {
        parser.handleError(e);
    }
}

从:Argument.type()复制和改编的示例,使用自定义类型PerfectSquare搜索并向下滚动到示例

Argument.type()有一个接受实现ArgumentType接口的对象的版本。

另见:Pass optional parameters to a CLI program - Java

票数 3
EN

Stack Overflow用户

发布于 2022-11-24 18:58:55

文档说,除了原语之外,它还可以转换为任何具有公共静态"valueOf(String)“方法的对象。

工期是最后一个类,并且没有"valueOf“方法,就像您已经注意到的那样,解析()。

所以TLDR;不。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74564952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档