Size: a a a

Kotlin Community

2020 June 07

M

Mi in Kotlin Community
я просто пытаюсь выработать какие-то общие правила для всего этого, но вариантов много
источник

X

X in Kotlin Community
Всем привет. Столкнулся с оооочень странной ситуацией и пока не могу понять, почему так произошло. Ситуация из разряда "такого никогда не могло произойти". Надежда на то, что кто-то может быть подскажет, где я ошибся и чего не понял.
В общем, есть код, в котором я получаю новую заявку от биржи. Если эта заявка уже есть в локальном кэше (нахожу по двум идентификаторам: id и clientId), я ее из кеша удаляю (старую версию этой заявки) и снова добавляю ее обновленную версию. И веду логи. Все прекрасно работало без изменений несколько дней. Потом я обнаружил, что это не сработало и ордер не удалился из кэша и добавился повторно. Этого в принципе никогда не должно было случиться. И это можно отследить по логам, которые я привожу. Может, у кого-то глаз наметан и вы поймете, где косяк. Привожу код и логи в сокращенном виде (потому как там еще очень много дополнительных параметров, но суть я не удалял точно). Функция isSame() в первоначальном виде, не изменена. Именно она определяет нужный ордер из кэша.  Есть идеи, как могло так получиться, что ордер прошел строку с удалением и не удалился? Если это важно, client.receiveData() и client.findOrderByOrderId() suspend методы тоже. Выкладываю скрин, чтобы синтаксис был подсвечен. Могу выложить код, если так будет удобнее
источник

X

X in Kotlin Community
источник

X

X in Kotlin Community
Ссылка на код https://pastebin.com/0UqkSNd6
источник

VS

Vladimir Sitnikov in Kotlin Community
Есть какой-нибудь способ подставлять многострочный код внутрь .trimIndent() ?

val txt = """
   Hello
   $multilineVar
   World
   """.trimIndent()


Тут multilineVar интерполируется до вызова trimIndent, и, соответственно, trimIndent неправильно отрабатывает (пробелы перед Hello не отсекаются)

Можно, конечно, разорвать литерал и записать вот так, но выглядеть будет коряво. Это единственный способ?

val txt = """
   Hello
   """.trimIndent() + multilineVar + """
   World
   """.trimIndent()
источник

BP

Bogdan Panchenko in Kotlin Community
Ордер не удалится если в runCatch произошла ошибка. Также вопрос. Не удаляется в каком смысле ? Есть многопоточка ?
источник

BP

Bogdan Panchenko in Kotlin Community
Vladimir Sitnikov
Есть какой-нибудь способ подставлять многострочный код внутрь .trimIndent() ?

val txt = """
   Hello
   $multilineVar
   World
   """.trimIndent()


Тут multilineVar интерполируется до вызова trimIndent, и, соответственно, trimIndent неправильно отрабатывает (пробелы перед Hello не отсекаются)

Можно, конечно, разорвать литерал и записать вот так, но выглядеть будет коряво. Это единственный способ?

val txt = """
   Hello
   """.trimIndent() + multilineVar + """
   World
   """.trimIndent()
Может попробовать вариант с |
источник

VS

Vladimir Sitnikov in Kotlin Community
Bogdan Panchenko
Может попробовать вариант с |
Да, не подумал, что оно не будет менять строки, в которых не было |
источник

X

X in Kotlin Community
Bogdan Panchenko
Ордер не удалится если в runCatch произошла ошибка. Также вопрос. Не удаляется в каком смысле ? Есть многопоточка ?
почему он не удалится? runCatching стоит же после удаления. При этом FOUND ORDER напечаталось, следовательно в runCatching не было exception'ов. В логе FOUND ORDER написано, что ordersBySymbol содержит удаленный (по задумке) ордер
источник

BP

Bogdan Panchenko in Kotlin Community
X
почему он не удалится? runCatching стоит же после удаления. При этом FOUND ORDER напечаталось, следовательно в runCatching не было exception'ов. В логе FOUND ORDER написано, что ordersBySymbol содержит удаленный (по задумке) ордер
Где после удаления, из мапы никто ничего не удалял
источник

X

X in Kotlin Community
Bogdan Panchenko
Ордер не удалится если в runCatch произошла ошибка. Также вопрос. Не удаляется в каком смысле ? Есть многопоточка ?
if (existingOrder != null) ordersBySymbol = ordersBySymbol - existingOrder

Вот тут ordersBySymbol должен был сохранить в себе такой же массив за исключением existingOrder. Но по факту и existingOrder там остался. Многопоточки, связанной с этим кодом, нет
источник

X

X in Kotlin Community
Bogdan Panchenko
Где после удаления, из мапы никто ничего не удалял
пама не причем, это сейчас неважно. Почему то ordersBySymbol содержит удаленный элемент
источник

BP

Bogdan Panchenko in Kotlin Community
Ну оператор минус удалить первый попавшийся елемент, а не все, возможно есть дуближи ?
источник

X

X in Kotlin Community
есть предположение, что ordersBySymbol содержал до этого процесса два одинаковых элемента. Один из них удалился, а  второй - остался. Только вот весь код так прост, что просто негде взяться копии объекта ордера. Потому что они приходят с биржи и там в ответе нет копий
источник

BP

Bogdan Panchenko in Kotlin Community
X
есть предположение, что ordersBySymbol содержал до этого процесса два одинаковых элемента. Один из них удалился, а  второй - остался. Только вот весь код так прост, что просто негде взяться копии объекта ордера. Потому что они приходят с биржи и там в ответе нет копий
Если копии вас не нужны стоит использовать Set
источник

X

X in Kotlin Community
я переделаю код, будет по-другому, не вопрос. Проблема в том, что когда подобный простой код не срабатывает и я не понимаю причину, я не могу быть уверен во всем остальном коде:)
источник

X

X in Kotlin Community
Bogdan Panchenko
Если копии вас не нужны стоит использовать Set
и сет в данном случае тоже не вариант, потому что hashCode будет другой у одного и того же ордера, потому как в нем может измениться цена или еще какой-нибудь параметр. Так что надо разобраться, почему ордер не удалился или как там оказался дубликат
источник

BP

Bogdan Panchenko in Kotlin Community
X
я переделаю код, будет по-другому, не вопрос. Проблема в том, что когда подобный простой код не срабатывает и я не понимаю причину, я не могу быть уверен во всем остальном коде:)
Тесты. Либо выкинуть мутабельные состояния
источник

BP

Bogdan Panchenko in Kotlin Community
X
и сет в данном случае тоже не вариант, потому что hashCode будет другой у одного и того же ордера, потому как в нем может измениться цена или еще какой-нибудь параметр. Так что надо разобраться, почему ордер не удалился или как там оказался дубликат
Сет проверяет по equals и не даёт добавить, в отличии от листа
источник

X

X in Kotlin Community
Bogdan Panchenko
Тесты. Либо выкинуть мутабельные состояния
его там нет. Ну то есть сам ордер, конечно, мутабельный, но используется list вместо arraylist как раз для избегания влияния многопоточности
источник