Это имеет смысл - показать контейнер JVM/CDI, который я хочу выпустить SomeOtherBean?
@Singleton
public class SingleBean {
@Inject
SomeOtherBean someBean;
private Map values;
@PostSonstruct
private void postConstruct() {
someBean.doThis();
someBean.doThat();
values = someBean.retrieveValues();
//...
someBean = null; //don't need this anymore.
}
public Object getValue(String key) {
return values.get(key);
}
}
Почему бы вам просто не использовать @Inject для конструктора SingleBean и не хранить значение someotherbean в поле, если вам это больше не нужно.
Это присвоение null
не требуется, так как экземпляр SomeOtherBean
все равно будет ссылаться на структуру DI. Кроме того, он знал, что сборщик мусора освобождает память недетерминированно.
Как и другие, вам лучше вставить компонент в конструктор и заполнить карту там вместо того, чтобы делать это в методе @PostConstruct
.
EDIT (согласно комментарию @JanGalinski):
Что касается части "хорошей практики", я не считаю хорошей практикой оставлять null
ссылку в поле. Что, если кто-то позже расширяет класс SingleBean
и ожидает, что это поле будет иметь SomeOtherBean
ссылку на SomeOtherBean
? У вас может быть NPE...
Система CDI почти наверняка будет иметь компонент в своем реестре, поэтому вы не будете выпускать какую-либо память. Однако лучше использовать инжектор конструктора вместо @PostConstruct
всякий раз, когда это целесообразно, поскольку его проще и легче тестировать.