我发现它在Ruby中可用,但我从我在Python中所做的工作中认识到了它;"splat"操作符。长话短说,我想知道是否有一种更简单的方法来实现我现在的状态,模仿"splat"操作符的操作。
我制作了一个其他人可以调用的中心方法,因为我意识到我有几个非常相似的方法,除了一些小事情之外,它们都在做同样的事情。这是方法签名:
private String callScript(String scriptLocation, String... extraArgs) throws Exception {
我希望至少需要一个参数(scriptLocation
),然后允许任意数量的额外参数。我最终要做的是创建一个ProcessBuilder
。我的愿望是做这样的事情:
ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */);
当然,ProcessBuilder
构造函数只接受以下内容:
List<String>
String[]
String...
所以我的方法显然行不通。
据我所知,我目前的解决方法是:
List<String> finalArgs = new ArrayList<String>();
finalArgs.add("something");
finalArgs.add(scriptLocation);
finalArgs.addAll(Arrays.asList(extraArgs));
ProcessBuilder pb = new ProcessBuilder(finalArgs);
(是的,我知道我不必使用List
,只需制作一个String[]
)
(是的,我知道我可以循环使用extraArgs
,并将它们单独添加到finalArgs
,而不必使用addAll
和Arrays.asList()
)
(是的,我知道我可以制作一个函数,通过返回某些参数和变量参数来有效地完成我的变通方法)
所以我想,除了这最后三个声明之外,还有什么可以实现这一点吗?
这取决于您对simpler的定义,但您可以使用Builder模式编写一个类:
public class MyProcessBuilder {
List<String> args;
MyProcessBuilder( String text, String location ) {
args = new ArrayList<String>();
args.add( text );
args.add( location );
}
MyProcessBuilder arg( String arg ) {
args.add( arg );
return this;
}
MyProcessBuilder args( String... args ) {
this.args.addAll( Arrays.asList( args ) );
return this;
}
public ProcessBuilder go() {
return new ProcessBuilder( args );
}
public static MyProcessBuilder callScript( String location ) {
return new MyProcessBuilder( "something", location );
}
public static void main( String[] args ) {
callScript( "/tmp/bla" ).arg( "something else" ).arg( "more" ).go();
}
}
编写一个实用程序splat()
并发布它?:)
这看起来可能更统一:
List<String> finalArgs = new ArrayList<String>();
finalArgs.addAll(Arrays.asList( "something" ));
finalArgs.addAll(Arrays.asList( scriptLocation ));
finalArgs.addAll(Arrays.asList( extraArgs )));
ProcessBuilder pb = new ProcessBuilder(finalArgs);
当您调用时
ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */);
如果你有
public ProcessBuilder(String something, String scriptLocation, String... extraArgs);
然后你可以用多种方式调用这个方法:
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh");
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh","someArg");
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh","someArg","someArg2");
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh");
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{});
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{"someArg"});
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{"someArg","someArg2"});
ArrayList<String> someStringList = new ArrayList<String>();
someStringList .add("SomeArg");
someStringList .add("SomeArg2");
String[] extraArgs = someStringList .toArray(new String[someStringList .size()]);
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",extraArgs);