Size: a a a

Kotlin Community

2020 October 29

AM

Andrew Mikhaylov in Kotlin Community
Lev Shagalov
Если я над каждым классом допишу нечто вроде someList.add(ThatEntity::class)
А потом при старте приложения прочитаю этот someList и использую для SerializersModule - это сработает? Или там будет засада с порядком исполнения someList.add ? И где тогда такой someList надо объявлять?
Котлин так не умеет. Даже если заморочиться со статическими инициализаторами (читай init-блоки у компаньонов в этом случае), они всё равно будут вызываться только тогда, когда что-то потрогает соответствующий класс.
источник

AM

Andrew Mikhaylov in Kotlin Community
Максимум -- свой компайлер плагин писать 🌚
источник

LS

Lev Shagalov in Kotlin Community
Пишу либу - клиент для базы данных.
Либа использует сериализацию.
Разрабу придется писать @Serializable для сущностей, чтобы либа могла их сериализовать.
То есть сериализация все-равно торчит из либы (что меня несколько напрягает. Разраб то будет использовать сериализацию тоже, разные версии наверно могут поссориться).
Имеет ли смысл старятся спрятать @SerialName внутрь аннотации либы (и сделать свою мапу сериализаторов вместо SerializersModule)?
Или пусть вместе с @Serializable торчит и @SerialName?
источник

LS

Lev Shagalov in Kotlin Community
Еще можно попросить разраба самого предоставить методы сериализации. И пусть тогда что хочет то и использует.
источник

VP

Vladimir Petrakovich in Kotlin Community
Lev Shagalov
А ну... дык я как раз не хочу их перечислять. ) Я хочу чтобы оно автоматом сообразило))

Извиняюсь, я не корректно выражался, ввел в заблуждение. Я не хочу их перечислять. Вы сказали что можно через рефлексию. Но в common нельзя. А может можно в js и jvm по отдельности? Или может есть планы, что это можно будет сделать в js а пока есть только в jvm

Мне подсказали, что такое можно сделать через kapt, но я пока не могу в нем разобраться.
Тут не обойтись без какой-то обработки при сборке. Нормальный путь - через плагин компилятора, менее нормальный - kapt или какой-нибудь велосипед.
источник

СТ

Сергей Троян... in Kotlin Community
вопрос по корутинам
я правильно понял что куски корутины выполнясь друг за другом, не обязаны выполняться на одном треде в случае если у диспатчера тредов больше одной?
источник

VP

Vladimir Petrakovich in Kotlin Community
Сергей Троян
вопрос по корутинам
я правильно понял что куски корутины выполнясь друг за другом, не обязаны выполняться на одном треде в случае если у диспатчера тредов больше одной?
Да, всё так
источник

СТ

Сергей Троян... in Kotlin Community
launch {
           var x=0
           delay(100)
           x++
           delay(100)
           if(x!=1){
               //вполне возможная ситуация ??
           }
       }
источник

СТ

Сергей Троян... in Kotlin Community
Vladimir Petrakovich
Да, всё так
а есть возможность как-то принудить оставшиеся куски выполняться именно на том треде с которого начали?
источник

VP

Vladimir Petrakovich in Kotlin Community
Сергей Троян
launch {
           var x=0
           delay(100)
           x++
           delay(100)
           if(x!=1){
               //вполне возможная ситуация ??
           }
       }
Корутина выполняется последовательно, тут никаких сюрпризов
источник

VP

Vladimir Petrakovich in Kotlin Community
Сергей Троян
а есть возможность как-то принудить оставшиеся куски выполняться именно на том треде с которого начали?
Только запустить её на однопоточном диспатчере
источник

СТ

Сергей Троян... in Kotlin Community
да но если ее будут изменять в разных тредах, она не обязательно синканется
источник

VP

Vladimir Petrakovich in Kotlin Community
Сергей Троян
да но если ее будут изменять в разных тредах, она не обязательно синканется
Вы про понятие happens-before в курсе?
источник

СТ

Сергей Троян... in Kotlin Community
а оно здесь поможет?
источник

VP

Vladimir Petrakovich in Kotlin Community
Сергей Троян
а оно здесь поможет?
Да, речь именно об этом. Гарантируется ли, что код, выполняющийся дальше в корутине, видит изменения из кода, выполняющегося раньше. Ответ - да.
источник

СТ

Сергей Троян... in Kotlin Community
Vladimir Petrakovich
Да, речь именно об этом. Гарантируется ли, что код, выполняющийся дальше в корутине, видит изменения из кода, выполняющегося раньше. Ответ - да.
раньше этот термин в java для синхронизации между тредами использовали.. так его для корутин переформулировали?

т.е. прям все изменения одного куска корутины выполнявшиеся на другом треде гарантированно попадут последующему?
источник

RE

Roman Elizarov in Kotlin Community
Я вот здесь попытался максимально доступно рассказать, чтобы не надо было всю теорию параллельных вычислений изучать: https://proandroiddev.com/what-is-concurrent-access-to-mutable-state-f386e5cb8292
источник

RE

Roman Elizarov in Kotlin Community
Но вообще теория параллельных вычислений это очень интересная штука и я очень рекомендую её все-таки изучать. Там очень формально вводятся все соответствующие понятия. Например, последовательное исполнение это очень формализованное и четко-определенное понятие.
источник

СТ

Сергей Троян... in Kotlin Community
Roman Elizarov
Я вот здесь попытался максимально доступно рассказать, чтобы не надо было всю теорию параллельных вычислений изучать: https://proandroiddev.com/what-is-concurrent-access-to-mutable-state-f386e5cb8292
там написано
function yield performs synchronization

ок
источник

VP

Vladimir Petrakovich in Kotlin Community
Сергей Троян
раньше этот термин в java для синхронизации между тредами использовали.. так его для корутин переформулировали?

т.е. прям все изменения одного куска корутины выполнявшиеся на другом треде гарантированно попадут последующему?
Его не переформулировали, да и оно в целом не про треды, но как и с тредами в корутинах действует правило: "если работать с данными из одного потока/корутины, про это всё можно не думать"
источник