
Di7aK
30.08.2018
13:12:01
да какая нам java8 андроид терпилам

Andrey
30.08.2018
13:12:41

Andrew
30.08.2018
13:13:38

Di7aK
30.08.2018
13:14:02
я как то в эксперементальные технологии не входил

Google

Di7aK
30.08.2018
13:14:06
слышал конечно

Георгий
30.08.2018
13:14:23

Di7aK
30.08.2018
13:14:50
всм
вы про то что может обычное наследование делать?

Andrew
30.08.2018
13:15:10

Di7aK
30.08.2018
13:15:30
ну котлин вроде как заменил яву год назад

Георгий
30.08.2018
13:15:54
Если бы)))

Andrew
30.08.2018
13:16:11
Пока только чуть больше половины явы по статистике, и это ж только в ведре всё так хорошо

Igor
30.08.2018
13:16:24

Георгий
30.08.2018
13:16:37

Di7aK
30.08.2018
13:17:01

Георгий
30.08.2018
13:17:36
Что-то я потерял нить разговора.. Кто на бейсиках пишет?

Di7aK
30.08.2018
13:17:48
я имел ввиду что предвзятое отношение у них

Google

Igor
30.08.2018
13:17:55
https://gist.github.com/komigor/ed96d81871f79f5d9f58869c5657445c
Pазница в том, что не нужно сильно с ума схoдить с констpуктоpами, плюс любой TraitImpl будет объектом.

Andrew
30.08.2018
13:17:56
И легаси без боя не сдастся.
Ну тактика у котлина как раз анти-легасийная, мол, вы по чуть-чуть, можете даже с тестов начать, не понравится — откатитесь :)
Хотя с теми же корутинками уже всё не так радужно.

Igor
30.08.2018
13:18:00
Кмк. Удобнее.

Di7aK
30.08.2018
13:18:09
не хотят просто переходить и ничего не поделаешь

Георгий
30.08.2018
13:20:35

Igor
30.08.2018
13:21:00
@root_talis
https://gist.github.com/komigor/366deed16f1c93b37ed01acb6a4328b6
И кстати, вот вам отличный пpимеp, где захoдит arrow-kt.


Георгий
30.08.2018
13:31:09
Ммм, я чуть другое имел ввиду:
interface MyTrait {
fun execute()
val executionsCount: Int
}
class MyTraitImpl: MyTrait {
override fun execute() {
executionsCount++
}
override var executionsCount: Int = 0
private set
}
class MyTraitConsumer
private constructor(
private val impl: MyTraitImpl
)
: MyTrait by impl {
constructor() : this(MyTraitImpl())
}
И у каждого инстанса MyTraitConsumer будет свой счётчик вызовов execute.

Igor
30.08.2018
13:32:33


Георгий
30.08.2018
13:36:02
Так а где тогда раполагается та логика, к которой я хочу делегировать? В MyTrait2Impl или в MyDependency?

Igor
30.08.2018
13:36:59
Очевидно же. Если вам что-то нужно для создания trait, то пpoкидываем это чеpез констpуктоp, если не нужно – то тогда у вас можно вообще смело делать пpoстo object instance вашего тpейта, потому что туда ничего не нужно пеpедавать

Георгий
30.08.2018
13:38:34
Понял, спасибо :)

Igor
30.08.2018
13:40:34
Понял, спасибо :)
https://gist.github.com/komigor/366deed16f1c93b37ed01acb6a4328b6
MyTrait3 stateless, поэтому мы можем сделать его объектом. Как только MyTrait3 становится stateful, мы выносим создание trait-ов в функцию instance, чтобы гаpантиpoвать уникальный стейт каждого из клиентов.
Понял, спасибо :)
Но я еще pаз сакцентиpую ваше внимание на том, что лучше не делать stateful тpейтов :)

Andrew
30.08.2018
13:45:01
Справедливости ради, в зависимости от параметров можно различные stateless-трейты делать, так что в фабрике может быть нужна и без состояния.

Igor
30.08.2018
13:52:12
Согласен.
Вообще, следующий пpoект скоpее всего попытаюсь написать в полностью функциональном стиле, как-pаз довольно пpoстой мини-стаpтап намечается. Думаю, будет пpикольно.

Google

Andrey
30.08.2018
13:58:04
Замечание про делегацию: если в объекте, которому делегируется реализация интерфейса, одни члены определены через использование других, то при переопределении используемых членов в делегирующем классе, поведение определённых через них не поменяется. Пример:
fun main(args: Array<String>) {
val dog = Dog()
println(dog.voice()) // выведет переопределённое значение "woof"
println(dog.song()) // выведет "silence silence silence", используется метод voice из defaultAnimal
}
interface Animal {
fun voice(): String
fun song(): String
}
val defaultAnimal: Animal = object : Animal {
override fun voice(): String = "silence"
override fun song(): String = (1..3).joinToString(" ") { voice() }
}
class Dog: Animal by defaultAnimal {
override fun voice(): String = "woof"
}

Глеб
30.08.2018
13:59:55

Andrew
30.08.2018
14:00:30
Можно попробовать прочитать это в доке, там тоже это есть :)

Глеб
30.08.2018
14:00:37
оп, осознал. Подлянка, однако.

Andrew
30.08.2018
14:01:13
Да логично, вообще говоря — делегат-то ничего не знает о том, кто через него интерфейс реализует

Andrey
30.08.2018
14:01:33
Его при инстанцировании можно попортить
Можно ещё так: зачем вообще делегата в val пихать?
interface Interface {
fun foo(): String
}
class Trait() : Interface {
override fun foo(): String = "foo"
}
class TypeA : Interface by Trait()

Andrew
30.08.2018
14:02:16
Ну или переопределять метод, а потом обращаться к делегату — super-то нету.

Andrey
30.08.2018
14:03:03

Andrew
30.08.2018
14:08:42
Я даже делился конкретной проблемой недавно — часть функциональности common-класса отдать на откуп platform-модулям просто так нельзя, потому сделал публичный интерфейс, internal expect class и публичный класс, который реализовывал интерфейс через делегат, при этом имея нужду пинать вещи, не закрытые интерфейсом.

Andrey
30.08.2018
14:10:48

Andrew
30.08.2018
14:11:20
Ну у меня просто не трейты задача была делать, а вырвать часть функциональности класса в другой.

Igor
30.08.2018
14:15:48

Andrey
30.08.2018
14:18:14


Andrew
30.08.2018
14:21:56
А что есть expect класс? Где можно вообще о новых модификатоpах почитать? Я что-то не замечать стал новостей kotlin
В общем суть следующая: есть common-модуль, в котором может быть только чистый Kotlin, есть platform-модули под jvm, android, js, native, которые кроме Kotlin могут ещё с платформой общаться (Java-классами, dynamic-типом, cinterop-ом соответственно).
Для того, чтобы из common-кода обращаться к платформозависимым штукам, в common объявляется expect-декларация. в каждом соответствующим platform-модуле — actual. Работает примерно как интерфейс с наследованием, только чуть иначе — можно например объявить expect class Date с нужными методами и соответствующим ему actual typealias Date = java.util.Date.
Когда это собирает компилятор под конкретную платформу, он берёт все сорцы (и коммон, и платформ), соединяет expect с actual и собирает обычным способом.
Инфы не особо много пока что, увы. По большей части доводится гулять по гитхабу и вдохновляться примерами.
https://kotlinlang.org/docs/reference/multiplatform.html


Igor
30.08.2018
14:22:55
Ха, пpикольно. Нужно мне будет попpoбoвать что-нибудь гибpидное написать уже в кои-то веке.

Andrew
30.08.2018
14:24:05
В теории за счёт этого можно взять, к примеру, какой-нибудь Clean Architecture, бОльшую часть кода написать в common-модуле, оставить UI, сеть, БД, локализацию и прочие вещи на откуп платформам и заиметь кросс-платформенную аппу на нативном ведровом UI, каком-нибудь реакте и привычном iOS-ном фаундейшне, переиспользуя максимум кода.
(Хотя будет очень много натягивания совы на глобус с тем же Clean и Реактом, наверное, но это просто пример)

Никита
30.08.2018
14:25:32
Народ как сделать публичный сеттер у приватного поля?
private var i: Int = 0
public set(value) {
field = value
}

Google

Andrey
30.08.2018
14:26:10

Andrew
30.08.2018
14:26:16
Я вот играюсь с оборачиванием сишной библиотечки на JVM и Native — пока интеропа между ними двумя не завезли, приходится писать на K/JVM через JNI, на K/N — через cinterop, но вот эта вот прослойка дикая в итоге останется в либе и снаружи должно быть приятно использовать.

Andrey
30.08.2018
14:28:52

Admin
ERROR: S client not available

Никита
30.08.2018
14:35:39
ага

Bogdan
30.08.2018
14:47:16

Георгий
30.08.2018
14:47:45

Andrey
30.08.2018
14:49:39

Vadim
30.08.2018
14:50:57
кто переходил на API 28? и сразу меняли ли
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
на USE_BIOMETRIC ?

Alexander
30.08.2018
15:15:10
В теории за счёт этого можно взять, к примеру, какой-нибудь Clean Architecture, бОльшую часть кода написать в common-модуле, оставить UI, сеть, БД, локализацию и прочие вещи на откуп платформам и заиметь кросс-платформенную аппу на нативном ведровом UI, каком-нибудь реакте и привычном iOS-ном фаундейшне, переиспользуя максимум кода.
Делал кросс на javafx и js frontend-е. Вся логика в общем модуле, наружу торчит только интерфейс для визуализации с колбэками

Andrew
30.08.2018
15:16:51

Alexander
30.08.2018
15:18:00
Чистый kotlin-js с парой внешних js-ных библиотек, но это не важно
Там может быть что угодно, view полностью изолирован от логики интерфейсом

Andrew
30.08.2018
15:21:04
Логично, конечно.

?Kolay
30.08.2018
15:55:35
какой корутин контекст юзать в jvm для бэкэнда?

Mikhail
30.08.2018
16:18:20

Георгий
30.08.2018
16:20:25

Google

OlegKrikun
30.08.2018
16:25:52
Хозяюшке на заметку
https://plus.google.com/111471886409455069782/posts/fyfMRjHGf3k

dimiii
30.08.2018
17:36:54

OlegKrikun
30.08.2018
18:35:53
И?

Alexander
30.08.2018
18:44:10
Поймал какую-то дикую ошибку компилятора на интеропе с явой. Даже не знаю как тикет писать.
Есть котлиновский интерфейс Table, от него наследуется java class ColumnTable
Talble имеет проперти columns, который отдает коллекцию джавовских Coluimn (это не by design, просто кусок кода не переведен еще под котлину)
В этом Column`есть `String getName()
Есть анонимная реализация Column на котлине.
Так вот, к чему это я. Когда я в Java вызываю для этого объекта типа Column .getName(), ловлю NoClassDefFoundError
Решение простое - переписать наконец куски на котлину. Но такая ошибка, что я ее даже описать просто не могу.

Quantum Harmonizer
30.08.2018
18:48:42
тоже пишешь обёртку над SQL, что ли? :)

Alexander
30.08.2018
18:51:02
Да нет. Просто полумигрированный код с джавы на котлину
Там обычные таблицы без всякого SQL
После перевода оставшихся классов на котлину все починилось. Но ошибка - не воспроизвести не в жизнь.
Она кстати еще как-то неправильно выкидывалась вверх по стэку, так что вместо того, чтобы выкинуться, все просто подвисало в каком-то месте

Hip
30.08.2018
19:14:08
ппц флуд

Рамазан
30.08.2018
21:27:16

Rikland
30.08.2018
21:55:55
Эм. OpenJDK 11
Новичок ты наш. Поставь что-то типа libatk-java. Может отпустит

Никита?❄️
31.08.2018
00:45:15
ночи всем доброй! есть ситуация: получаю через рефлексию котлина все поля, но апдейтятся только свои поля, а поля суперкласса, которые override-нутые - не трогаются. почему?
вот код

Alexandr
31.08.2018
04:01:30

Bogdan
31.08.2018
04:02:15