Избегайте "неинициализированных" ошибок на введенных полях при использовании Checker Framework
Nullness Checker в Checker Framework генерирует ошибку при обнаружении неинициализированного поля.
[ERROR] /home/glts/src/example/src/main/java/BookRepositoryImpl.java:[39,7]
error: [initialization.fields.uninitialized] the constructor does not initialize fields: em
Теперь, это обычная схема, когда некоторые поля вводятся через внедрение зависимостей:
@Repository
public class BookRepositoryImpl implements BookRepository {
@PersistenceContext
private EntityManager em;
@Override
@Nullable
public Book findById(int id) {
return em.find(Book.class, id);
}
// ...
}
Здесь @javax.persistence.PersistenceContext
аннотация гарантирует, что em
будет содержать ссылку на EntityManager
экземпляр после того, как хранилище было построено.
В более общем случае, в этих случаях среда приложения гарантирует, что поля инициализируются и не равны нулю, когда они используются, но Checker Framework не может этого знать.
До сих пор я обнаружил, что одним из способов является преобразование инжекции поля в конструктор (@Inject
). Это не вариант в приведенном выше примере.
Есть ли способ сообщить Checker Framework, что поле вводится и, следовательно, правильно инициализируется и не является нулевым, без простого подавления этих ошибок?
1 ответ
Вы можете подавить ошибку для одного поля, написав @SuppressWarnings("initialization.fields.uninitialized")
на поле декларации.
Вы можете подавить ошибку для всех полей, написав @SuppressWarnings("initialization.fields.uninitialized")
на уроке.
Существуют структуры внедрения, которые могут вводить нуль как значение, где @PersistenceContext
существует аннотация, например, когда XML-файл отсутствует, код не выполняется в транзакции и т. д. @SuppressWarnings("initialization.fields.uninitialized")
аннотация - это ваш способ сказать, что вы уверены, что тот, который вы используете, всегда будет вводить ненулевое значение для вашего кода.