我希望使用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中接受工期作为参数?
发布于 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)。
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字符串并转换为所需的持续时间类型:
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接口的对象的版本。
发布于 2022-11-24 18:58:55
文档说,除了原语之外,它还可以转换为任何具有公共静态"valueOf(String)“方法的对象。
工期是最后一个类,并且没有"valueOf“方法,就像您已经注意到的那样,解析()。
所以TLDR;不。
https://stackoverflow.com/questions/74564952
复制相似问题