PicoCLI: Как я могу использовать @ArgGroup для метода?

#picocli

#picocli

Вопрос:

Я хочу иметь взаимоисключающие параметры команд для приведенного ниже фрагмента :

 @Command(description = "test command")
public void test(
        @Option(names = { "-a"}, required = true, arity = "0", description = "print A") boolean a,
        @Option(names = { "-b"}, required = true, description = "pint B") boolean b) 

    // 
}
 

Если я использую @ArgGroup для поля класса, то это работает, но я хочу добиться того же для методов.

 class TestClass{

@ArgGroup(exclusive = true, multiplicity = "1")
private Sample sample = new Sample();

public static class Sample {
    @Option(names = { "-a"}, required = true, arity = "0", description = "print A") boolean a ;
    @Option(names = { "-b"}, required = true, description = "pint B") boolean b ;
    
    }
}
 

Ответ №1:

Вы должны иметь возможность использовать @ArgGroup аннотированный метод, точно так же, как @ArgGroup аннотированное поле.

Например:

 class SomeCommand implements Runnable {
    private Sample sample;

    @ArgGroup(exclusive = true, multiplicity = "1")
    void setGroup(Sample sample) {
        System.out.printf("setGroup was called with %s%n", sample);
        this.sample = sample;
    }

    static class Sample {
        @Option(names = "-a", required = true, arity = "0", description = "print A") boolean a ;
        @Option(names = "-b", required = true, description = "print B") boolean b ;

        public String toString() {
            return String.format("Sample[a=%s, b=%s]@%x", a, b, hashCode());
        }
    }

    public void run() {
        System.out.printf("In run, sample=%s%n", this.sample);
    }

    public static void main(String... args) {
        //System.setProperty("picocli.trace", "DEBUG");
        new CommandLine(new SomeCommand()).execute("-a");    
    }
}
 

Когда я запускаю это, я вижу следующий вывод:

 setGroup was called with Sample[a=false, b=false]@7de62196
In run, sample=Sample[a=true, b=false]@7de62196
 

Итак, вы можете использовать @ArgGroup метод -annotated; сначала он будет вызван с новым экземпляром, и этот экземпляр будет изменен после вызова метода setter .

(Мы можем получить больше информации о том, что происходит под капотом, включив трассировку picocli.)