Как я могу добавить поля интерфейса в качестве опции в picocli?

#java #command-line-interface #picocli

Вопрос:

У меня возникла проблема при рефакторинге моего кода, в котором используется picocli

Вот пример

 @Command(name='-classA')
class A{
  @Options(names = '-n1')
  public int num1;
  @Options(names = '-n2')
  public int num2;

  public void testA(){
    System.out.println("class A Testing");
    System.out.println(num1 num2);
  }
}
 
 @Command(name='-classB')
class B{
  @Options(names = '-n1')
  public int num1;
  @Options(names = '-n2')
  public int num2;

  public void testB(){
    System.out.println("class B Testing");
    System.out.println(num1 num2);
  }
}
 

В настоящее время мой инструмент cli работает следующим образом

 java -jar poo.jar -classA -n1 -n2
java -jar poo.jar -classB -n1 -n2
 

Хотя оба класса A и B работают хорошо, при рефакторинге моего кода
Я хотел использовать интерфейс для размещения общих переменных в одном месте.
Подобный этому

 interface MyInterface{
  @Options(names = '-n1')
  public int num1;
  @Options(names = '-n2')
  public int num2;

  public int getNum1(){return num1;}
  public int getNum2(){return num2;}
}
 

Однако, когда я запускаю свое приложение со всеми включенными опциями, оно выходит из строя при компиляции параметров интерфейса.

Неужели невозможно дать параметры переменным в интерфейсе?

Спасибо, что прочитали

Комментарии:

1. В java поля в интерфейсах являются константами: им присваивается значение во время компиляции, и это значение не может быть изменено во время выполнения. Таким образом, аннотирование полей в интерфейсе не будет работать, потому что picocli не сможет присвоить значение этим полям. Лучше вместо этого использовать класс.