Страницы

Поиск по вопросам

среда, 13 марта 2019 г.

Циклические зависимости при определении класса

При инициализации класса могут возникать deadlock'и.
Например, есть следующий код
class A { static final B b = new B(); }
class B extends A { }
Это потенциально проблемное место. Есть ли какие то решения для такого кода, позволяющие избежать данную ситуацию?
UDP:
Напишу подробнее.
Есть реализация неизменяемого списка.
abstract class List{ private static final List EMPTY = new Empty<>();
private remove(int index){ if(index<0) throw new IllegalArgumentException("index must be more zero"); return innerRemove(index); } protected abstract List innerRemove(int index);
public static List create(){ return EMPTY; } }
class Empty extends List{ protected List innerRemove(int index){return this} }


Ответ

Можно перенести поле EMPTY в класс Empty с соответствующей сменой видимости (как это и сделано в Guava).
Тогда класс Empty будет инициализирован либо при вызове List.create() (класс List в этот момент уже загружен), либо сам по себе (что может вызвать загрузку List, но т.к. List больше не требует Empty, дедлок исключен)

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

Отправить комментарий