Я хотел бы описать ожидаемые входные данные класса Java, предназначенного для выполнения определенной задачи,
в самом классе Java. Цель состоит в том, чтобы иметь возможность генерировать пользовательский интерфейс, непосредственно загружающий этот класс.
Например, предполагая, что базовый интерфейс равен Task
(реализует Runnable
):
public class BuildRectangleTask implements Task {
public void setLength(double val) { /* ... */ }
public void setWidth(double val) { /* ... */ }
public void run() { /* Build a rectangle */ }
}
Я мог бы использовать некоторое отражение, чтобы получить имена параметров из этого, а затем построить
соответствующая часть пользовательского интерфейса из этого, например:
<form>
<label for="length">Length: </label>
<input type="text"name="length" id="length" /><br />
<label for="width">Width: </label>
<input type="text"name="width" id="width" />
</form>
Это, вероятно, будет хорошо работать для очень простых примеров, но имена аксессоров не всегда могут перевести
правильно на естественный язык, не звучит неловко (их также может потребоваться перевод).
Кроме того, я также хотел бы иметь возможность иметь дополнительную информацию (например, какие из них будут необязательными или имеют значения по умолчанию).
Я собираюсь использовать аннотации для описания этого:
@Description(text="This tasks builds a rectangle")
public class BuildRectangleTask implements Task {
@Input(label="Length", optional=false)
public void setLength(double val) { /* ... */ }
@Input(label="Width", optional=true, default=10,
help="This is the width of the rectangle")
public void setWidth(double val) { /* ... */ }
public void run() { /* Build a rectangle */ }
}
Это также будет полезно для дополнительной информации, например, для нескольких вариантов:
@Input(label="Colour", options={"Red", "Green", "Blue"})
Я также хотел бы иметь возможность создавать другие типы пользовательских интерфейсов, например, командную строку, стиль get-opt, подобный этому, на основе информации:
java TaskProcessor BuildRectangle --help
usage: BuildRectangle --height= [ --width=10 ] [ --color= ]
Options:
--height= ...
--width= This is the width of the rectangle (defaults to 10).
--color= Red, Blue, Green.
Существует ли какой-либо стандартный набор аннотаций или обычная структура для достижения этого (или, возможно, другой подход), предпочтительно совместимые с Java и Groovy?
Мне бы хотелось, чтобы класс был как можно более автономным (т.е. избегать файлов конфигурации).
(Мне не обязательно определять, каким будет результат такой задачи и как она
должен отображаться.)