Я знаю, что Java обычно позволяет не заботиться о возвращенном объекте, если он присутствует в методе, но в этом случае я хочу убедиться, что пользователь Api добавляет возвращаемый экземпляр в список, иначе он будет выполнен прямо сейчас.
Обычная Java:
Runnable someTask() {
...
}
someTask(); // ok
Должно быть
Runnable someTask() {
...
}
addToExecutionList(someTask()); // ok
someTask(); // gives warning
Есть ли способ предотвратить это с помощью предупреждения времени компиляции?
Есть ли способ предотвратить это, скажем, предупреждение о компиляции?
Нет. Нет способа заставить вызывающего пользователя использовать возвращаемое значение метода. Что-то вроде FindBugs может иметь возможность сообщать об этом как обманном коде, если это вам поможет.
Вы можете добавить параметр в someTask
и позволить someTask
позаботиться о том, чтобы добавить себя в этот список:
void someTask(List<Runnable> executionList) {
// ...
executionList.add(task);
}
Но, конечно, это не помешает передать бессмысленный список этому методу.
Если вы хотите убедиться, что runnable всегда добавляется в очень специальный список, тогда вы должны изменить api, чтобы пользователь не смог вызвать someTask
, но увидит какой-то "factory", который создает задачу и добавляет ее в этот список. Который должен быть внутренним, чтобы никто не мог удалить вновь созданную задачу из этого списка (и так далее;))
AbstractTask
с List<Runnable> executionList
в качестве параметра конструктора и executionList.add(this)
в его конструкторе, а список бессмысленных элементов может быть проверен во время выполнения, может не улавливать все ошибки, но некоторые ,
Предупреждения о времени компиляции относятся только к наиболее распространенным ошибкам. Нормальная практика - игнорировать возвращаемые значения.
То, что вы можете использовать, - это инструмент статического анализа, например, поиск ошибок, checkstyle или статический анализ IntelliJ.