Страницы

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

четверг, 23 января 2020 г.

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

#java


При инициализации класса могут возникать 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}
}

    


Ответы

Ответ 1



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

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

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