דָּוִדdavidov777 (daviddavidov777) wrote,
דָּוִדdavidov777
daviddavidov777

МСК в 10

МСК в 10
private static LazyValue lv1 = new LazyValue()
{
@Override
protected Integer update()
{
return lv2.get(); // нарочно создаем губительную рекурсию
}
};

private static LazyValue lv2 = new LazyValue()
{
@Override
protected Integer update()
{
return lv1.get() + 1;
}
};

public static void main(String[] args)
{
// хитроумный способ вызвать StackOverflowException
System.out.println(lv2.get());
}


Довольно быстро мне порядком надоело вставлять костыли в код, чтобы предотвратить рекурсию тут и там, и я решил встроить в класс кэширования детектор рекурсии, который бы сработав, разматывал стэк до «зачинщика» рекурсии и выдавал какое-то значение по-умолчанию тем самым предотвращая StackOverflowException. Вот какая получилась реализация:
private static LazyValue lv1 = new RSLazyValue()
{
@Override
protected Integer update()
{
return lv2.get();
}

@Override
protected Integer getDefault()
{
return 0;
}
};

private static LazyValue lv2 = new RSLazyValue()
{
@Override
protected Integer update()
{
return lv1.get() + 1;
}

@Override
protected Integer getDefault()
{
return 10;
}
};

public static void main(String[] args)
{
// выведет 10
System.out.println(lv2.get());
}


Вся магия кроется в классе RSLazyValue (RS — это Recursion-Safe). В тот момент, когда обновление началось, ставится специальный флаг, который потом обязательно по окончанию обновления снимается. Если мы только что зашли в ту же функцию, а обновление в процессе, значит мы поймали рекурсию за хвост и надо с ней что-то делать. Решение в лоб — сразу вернуть значение по-умолчанию. Однако это не лучший способ, ведь тогда обработанное значение вернется в первый вызов функции и она вернет значение, основанное на своем же, только обработанном извне. Наиболее подходящий вариант — выкинуть исключение, которое размотает стэк вызовов до предыдущей «ипостаси» этой же функции и вернуть значение по-умолчанию оттуда.

Интересное предложение мебель для бара интернет-магазина по продаже мебели на металлокаркасе от производителя. Мебель для дома, офиса, кафе, бара, ресторана. Мебель от производителя по выгодным ценам.
Tags: мебель для бара
Subscribe

  • мультиварка panasonic

    мультиварка panasonic сайт здорового питания, приготовления вкусной и полезной пищи на самых лучших надёжных недорогих бытовых приборах 21-го века -…

  • New age.................

    Заниматься еще больше торговлей!Понять куда пойдет тренд. Учиться , как можно больше задавать как можно больше вопросов.не терять время на всякую…

  • music

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments