Как стать автором
Обновить
3
0

Пользователь

Отправить сообщение
Помогите разобраться с Double-check Locking. У вас в статье упоминается синглтон и возможность его использования. В другой статье приводится аналогичный пример и говорится
Just define the singleton as a static field in a separate class. The semantics of Java guarantee that the field will not be initialized until the field is referenced, and that any thread which accesses the field will see all of the writes resulting from initializing that field.

Правильно ли я понимаю, что в случае с «обычными» полями данных, если началась инициализация, но не закончилась, одним потоком (который первым вошел в synchronized блок), то другой поток может увидеть ссылку на объект data, которая будет уже не null. Будет ли, действительно, решена проблема с использованием static?

Применительно к вашему примеру, будет ли это работать, если заменить volatile на static?

public class Keeper {
    private static Data data = null;

    // остальной код
}
Теперь все стало понятно: index = h & (length — 1). Спасибо. Мне стоило начать со статьи про HashMap :)
Можете объяснить, не совсем понятно почему произошла коллизия на 4-м элементе? Из-за того что превышен изначальный размер LinkedHashMap? Или из-за чего?
Это всего лишь мои догадки, т.к. лишь в разделе Access Order приведен пример вызова конструктора.
Я хотел этим сказать, что valueOf применимо для случаев, когда pType полностью соответствует значению типа. По моему это очевидно. А что если я захочу, чтобы на значение «hello_my_name_is_vasya_bla_bla_bla» возвращался тип RequestType.VASYA, а не RequestType.HELLO_MY_NAME_IS_VASYA_BLA_BLA_BLA"

PS. Случайно нажал плюс на ваш комментарий, считаю его бесполезным. Это вы пытаетесь проявить впечатление на других, я лишь показал свой вариант решения конкретной проблемы.
Спасибо за комментарий, но я еще раз повторю, что в данном случае это работать не будет.

public static <T extends Enum> T valueOf(Class enumType, String name)
Returns the enum constant of the specified enum type with the specified name. The name must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)

Для простейшего случая pType == 'Hello' и типа RequestType.HELLO — это будет работать, но я отметил возможность обрабатывать любые строки.
Будет работать только в случае, если я передам в качестве pType: «SCENARIO_ONE», «SCENARIO_TWO», «SCENARIO_THREE». Но никак не «RequestOne», «RequestTwo»…
Согласен, лишнее. Поправил.
Я с вами полностью согласен на счет if..else и сам стараюсь пользоваться в основном такими конструкциями. Но данное решение сделало человека счастливым и я решил написать про это. Возможно это кому-то понравится. Ну очень уж сильно хотелось ему использовать switch.

Понятно, что в данном случае вопрос производительности встает остро для больших enum.
Map<String, Command> может помочь, но тогда весь код придется раскидывать по методам, в case же можно писать несколько строк кода не заворачивая все это в отдельный метод.

По поводу конструкции вида «case SCENARIO_ONE: scenarioOne(); break;» — привычка, когда вызывается только один метод внутри case.
Спасибо за отзыв.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность