Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用picocli处理具有多种类型的选项_Java_Picocli - Fatal编程技术网

Java 如何使用picocli处理具有多种类型的选项

Java 如何使用picocli处理具有多种类型的选项,java,picocli,Java,Picocli,我正在将现有应用程序转换为使用picocli。现有选项之一如下所示: -t, --threads [1, n] for fixed thread pool, 'cpus' for number of cpus, 'cached' for cached 这允许选项为正整数或两个特殊字符串之一。现有代码将其视为字符串,如果它不是特殊字符串之一,则将其传递给Integer.parseInt 当然,我可以用picocli做同样的事情,但我想知道是否有更好的方法来处理这个问题。例如,

我正在将现有应用程序转换为使用picocli。现有选项之一如下所示:

-t, --threads           [1, n] for fixed thread pool, 'cpus' for number of cpus, 'cached' for cached
这允许选项为正整数或两个特殊字符串之一。现有代码将其视为字符串,如果它不是特殊字符串之一,则将其传递给
Integer.parseInt


当然,我可以用picocli做同样的事情,但我想知道是否有更好的方法来处理这个问题。例如,允许对同一选项使用多个字段,并根据传递的内容填写相应的字段?这可能还允许我对可能的字符串选项使用枚举。

一个想法是为此创建一个类,例如,可能
ThreadPoolSize
,它封装了固定数值或动态值的枚举。您需要为此数据类型创建自定义转换器

然后,您可以按如下方式定义该选项:

@Option(name={“-t”,“--threads”},converter=ThreadPoolSizeConverter.class,
description=“[1,n]对于固定线程池,“CPU”用于CPU数量,“缓存”用于缓存”)
ThreadPoolSize ThreadPoolSize;
线程池大小和转换器的自定义数据类型可以如下所示:

-t, --threads           [1, n] for fixed thread pool, 'cpus' for number of cpus, 'cached' for cached
类线程池大小{
枚举动态{CPU,缓存}
int fixed=-1;//如果为-1,则使用动态值
动态;//如果为null,则使用固定值
}
类ThreadPoolSizeConverter实现CommandLine.ITypeConverter{
@凌驾
公共线程池大小转换(字符串值)引发异常{
ThreadPoolSize结果=新的ThreadPoolSize();
试一试{
result.fixed=Integer.parseInt(值);
如果(结果固定<1){
抛出新命令行。TypeConversionException(“无效值”+
值+“:必须为1或更多。”);
}
}catch(NumberFormatException){
试一试{
result.dynamic=ThreadPoolSize.dynamic.valueOf(
value.toLowerCase(Locale.ENGLISH));
}捕获(IllegalArgumentException ex){
抛出新命令行。TypeConversionException(“无效值”+
值+”:必须是“+
toString(ThreadPoolSize.Dynamic.values());
}
}
返回结果;
}
}

谢谢--这比只使用字符串要好!我想知道picocli中是否有空间容纳泛型复合类型——例如,您创建了一个类,该类为每个可能的类型都有一个字段,并且该类得到了类似于
@Option(composite=true)
的内容。然后,它会自动尝试按照定义的顺序将参数转换为每个字段类型,并在成功转换后停止。如果内部字段需要自定义转换等,也可以对其进行注释。不过,这种情况可能太少见,不值得直接支持。我的直觉是,在自定义类型转换器中执行此操作,就像我们在这里所做的那样,比尝试将其推入库中更干净。