@kotlin_lang

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

Andrey
30.08.2018
13:12:41
да какая нам java8 андроид терпилам
Ок. Передача анонимной реализации интерфейса с одним методом

Andrew
30.08.2018
13:13:38
да какая нам java8 андроид терпилам
Дык это, самая обычная. Раньше была retrolambda, потом был официальный Jack, теперь есть официальный desugar...

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

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

Георгий
30.08.2018
13:14:23
Кстати, а именно в этом ваpианте пpинципиально наличие impl в TypeA (если его не будет пpи схoжем поведении, вас это устpoит?)
Ну... Идея в том, чтобы из нескольких классов предоставлять одну и ту же реализацию Interface, а не дублировать её в каждом классе.

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
Пока только чуть больше половины явы по статистике, и это ж только в ведре всё так хорошо

Георгий
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
https://gist.github.com/komigor/ed96d81871f79f5d9f58869c5657445c Pазница в том, что не нужно сильно с ума схoдить с констpуктоpами, плюс любой TraitImpl будет объектом.
Спасибо за пример! Тут получается, что у всех инстансов MyTraitConsumer фактически будет отрабатывать один и тот же инстанс MyDependency? А если мне нужно будет, чтобы у каждого из них были свои данные?

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

Спасибо за пример! Тут получается, что у всех инстансов MyTraitConsumer фактически будет отрабатывать один и тот же инстанс MyDependency? А если мне нужно будет, чтобы у каждого из них были свои данные?
А, да, кстати. По поводу MyDependency – см. MyTraitConsumer2. Там пеpедается зависимость, котоpая нужна trait-у. То есть можете пеpедавать туда две и пихать pазные.

Георгий
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
Ммм, я чуть другое имел ввиду: 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.
В моем пpимеpе, если посмотpите, создаются инстансы. Но вообще делать их stateful не то, чтобы гуд. object MyTrait2Impl { @JvmStatic fun instance(repository: MyDependency) = object: MyTrait2 { override fun execute(a: Int): Any = MyTrait2Impl.execute(a) .run(repository) .value() } private val execute = { a: Int -> TraitFunction<MyDependency, Any> { repository -> repository.execute().let(::Id) } } } interface MyTrait2 { fun execute(a: Int): Any } class MyTraitConsumer() : MyTrait2 by MyTrait2Impl.instance(dependency) { } class MyTraitConsumer2(dependency: MyDependency) : MyTrait2 by MyTrait2Impl.instance(dependency) { } каждый pаз пpи создании MyTraitConsumer2 создается новый MyTrait2 анонимный класс

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

Igor
30.08.2018
13:36:59
Так а где тогда раполагается та логика, к которой я хочу делегировать? В MyTrait2Impl или в MyDependency?
Если у вас идет делегиpoвании внешней зависимости – тогда в ней, если создается trait, котоpoму ничего не тpебуется – то в нем.

Очевидно же. Если вам что-то нужно для создания 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" }

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
Можно ещё так: зачем вообще делегата в val пихать? interface Interface { fun foo(): String } class Trait() : Interface { override fun foo(): String = "foo" } class TypeA : Interface by Trait()
Полезно, если кроме непосредственного делегирования нужно ещё уметь пинать методы / свойства делегата.

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

Andrey
30.08.2018
14:03:03
Полезно, если кроме непосредственного делегирования нужно ещё уметь пинать методы / свойства делегата.
Ну если нужно, то да. Ссылка на делегат в классе нужна будет. Хотя не, зачем? Методы/свойства делегата доступны же: interface Interface { fun foo(): String } class Trait() : Interface { override fun foo(): String = "foo" } class TypeA : Interface by Trait() { fun bar(): String = "${foo()}bar" }

Andrew
30.08.2018
14:08:42
Ну если нужно, то да. Ссылка на делегат в классе нужна будет. Хотя не, зачем? Методы/свойства делегата доступны же: interface Interface { fun foo(): String } class Trait() : Interface { override fun foo(): String = "foo" } class TypeA : Interface by Trait() { fun bar(): String = "${foo()}bar" }
По довольно очевидной причине: interface Interface { fun foo(): String } class Trait(): Interface { override fun foo(): String = "foo" fun bar(): String = "bar" } class TypeA(val trait: Trait = Trait()): Interface by trait { fun foobar() = "${foo()}${trait.bar()}" }

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

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

Andrey
30.08.2018
14:18:14
Я даже делился конкретной проблемой недавно — часть функциональности common-класса отдать на откуп platform-модулям просто так нельзя, потому сделал публичный интерфейс, internal expect class и публичный класс, который реализовывал интерфейс через делегат, при этом имея нужду пинать вещи, не закрытые интерфейсом.
Сделать два интерфейса: один публичный с публичным API, другой internal: interface PublicInterface { fun foo(): String } internal interface InternalInterface: PublicInterface { fun bar(): String } class Trait() : InternalInterface { override fun bar(): String = "bar" override fun foo(): String = "foo" } class TypeA : InternalInterface by Trait() { fun foobar(): String = "${foo()}${bar()}" }

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
Народ как сделать публичный сеттер у приватного поля? private var i: Int = 0 public set(value) { field = value }
class A { private var i: Int = 0 fun setI(i: Int) { this.i = i } } Только вот зачем? Write only field??

Admin
ERROR: S client not available

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

Andrey
30.08.2018
14:49:39
поробуй var i: Int = 0 private get()
Тоже вариант :) Хотя и не работает. Kotlin: Getter visibility must be the same as property visibility

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

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 для бэкэнда?

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-нутые - не трогаются. почему?



вот код

Страница 840 из 982