|
Использование value based классов в качестве объекта синхронизации
|
|||
---|---|---|---|
#18+
В описании класса Class Optional<T> сказано: Код: java 1.
В 25 пункте туторала 26 Reasons Why Using Optional Correctly Is Not Optional приведен код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
Несколько вопросов: 1). Почему операция == для объектов класса Optional может привести к непредсказуемым результатам? С equals и hashcode понятно, их можно переопределить по хранящемуся значению в них, но ссылки то на объекты в моем понимании фиксированные. 2). Отсюда второй вопрос, почему мы не можем использовать объекты класса Optional в качестве объекта синхронизации? На сколько я знаю у каждого объекта или класса есть свой монитор (возможно скрытое поле или какой то другой механизм, точно не знаю), и он однозначно привязан к этому объекту или классу. так если посмотреть на код: Код: java 1. 2. 3. 4. 5.
первое сравнение всегда будет возвращать false ? А второе зависит от хранимых в объектах op1 и op2 значений ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2020, 12:17 |
|
Использование value based классов в качестве объекта синхронизации
|
|||
---|---|---|---|
#18+
У меня единственная догадка, что это как то связано с оптимизацией кода, возможно при компиляции может произойти замена одного объекта на другой, если компилятор посчитает их одинаковыми. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2020, 12:30 |
|
Использование value based классов в качестве объекта синхронизации
|
|||
---|---|---|---|
#18+
faustgreen У меня единственная догадка, что это как то связано с оптимизацией кода, возможно при компиляции может произойти замена одного объекта на другой, если компилятор посчитает их одинаковыми. имхо, больше это связано с общей логикой. 1) == как операция не применима к значениям, и значит, не должна применяться к value type Не имеет значения результат операции, смысл которой не определен для данного случая. аналогично 2) - синхронизироваться имеет смысл только на изменяемых объектах В обоих случаях компилятору было бы хорошо выдавать ошибки времени компиляции о недопустимом использовании операции. Но пока пользуйтесь правилом большого пальца. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2020, 14:47 |
|
Использование value based классов в качестве объекта синхронизации
|
|||
---|---|---|---|
#18+
на первый вопрос я думаю ответ простой это два разных объекта,почему у них должны быть одинаковые ссылки если ты сделаешь вот так Код: java 1. 2. 3.
ссылки будут раны а когда ты делаешь Код: java 1. 2.
это два разных объекта,хотя их содержимое эквивалентно тоже самое ты получишь и тут Код: java 1. 2. 3.
FALSE ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2020, 19:58 |
|
Использование value based классов в качестве объекта синхронизации
|
|||
---|---|---|---|
#18+
faustgreen почему мы не можем использовать объекты класса Optional в качестве объекта синхронизации? 1. java.util.Optional#ofNullable может вернуть синглетон java.util.Optional#EMPTY, т.е. мы можем в коде, сами того не осознавая, получить кучу одинаковых мониторов 2. java.util.Optional immutable, в нем менять нечего, смысла в мониторе нет ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 09:26 |
|
Использование value based классов в качестве объекта синхронизации
|
|||
---|---|---|---|
#18+
faustgreen, Optional - это тип-обёртка. И тебе надо синхронизироваться не с обёрткой а с содержанием. Так будет правильно. Кроме того назначение Optional - это быть типом-контейнером. Переносить другие объекты. И если внутри Optional лежит константа EMPTY - тогда вся логика синхронизации ломается и ломается полиморфизм. Уже нельзя синхронизироваться без условия. Это осложняет смысл. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 12:00 |
|
|
start [/forum/topic.php?fid=59&msg=39937371&tid=2120877]: |
0ms |
get settings: |
24ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
151ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 269ms |
0 / 0 |