7

Ruby で利用できることがわかりましたが、Python で行ったことから認識しています。「スプラット」演算子。簡単に言えば、「splat」オペレーターの機能を模倣して、現在の自分を達成するためのより簡単な方法があるかどうか疑問に思っています。

非常によく似たメソッドがいくつかあり、いくつかの小さなことを除いてすべて同じことをしていることに気付いたので、残りが呼び出すことができる中心的なメソッドを作成しました。メソッドのシグネチャは次のとおりです。

private String callScript(String scriptLocation, String... extraArgs) throws Exception {

少なくとも 1 つの引数 ( 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追加できることを理解していますand )finalArgsaddAllArrays.asList()

(そして、はい、可変引数と組み合わせた特定の引数を返すことで、回避策を効果的に達成する関数を作成できることを知っています)

ですから、これらの最後の 3 つのステートメント以外に、これを達成できるものはあるのでしょうか?

4

3 に答える 3

2

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();
    }
}
于 2013-08-23T20:58:50.680 に答える
0

電話すると

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);
于 2013-07-27T01:39:12.427 に答える