Size: a a a

Kotlin Community

2020 February 10

RE

Roman Elizarov in Kotlin Community
Когда компаньен используется "по делу", то всё хорошо - очень приятная фича. Проблема в том, что когда компаньён начинают испльзовать как замену статиков, то это уже не выглядит красиво — повяляется лишний уровень идентации, появляется ненужный экземпляр компаньона. Часто можно просто перетащить "статики" на верхний уровень, но это не работает если нужен доступ к приватным членам класса.
источник

AN

Alexander Nozik in Kotlin Community
Roman Elizarov
Когда компаньен используется "по делу", то всё хорошо - очень приятная фича. Проблема в том, что когда компаньён начинают испльзовать как замену статиков, то это уже не выглядит красиво — повяляется лишний уровень идентации, появляется ненужный экземпляр компаньона. Часто можно просто перетащить "статики" на верхний уровень, но это не работает если нужен доступ к приватным членам класса.
То есть хочется разделить функции именно компаньена и неймспейс?
источник

RE

Roman Elizarov in Kotlin Community
Да, частенько нужен только неймспейс.  А сейчас "в нагрузку" прилетает еще и целый объект.
источник

AN

Alexander Nozik in Kotlin Community
Я просто пытаюсь понять, является ли MyClass.Companion.build(): MyClass "хорошим" использованием или нет? Здесь я явно использую его как неймспейс.
источник

AN

Alexander Nozik in Kotlin Community
Примерно понял, хотя пока я не видел это как проблему. Компаньены - очень мощная штука, потенцил которых, как мне кажется, еще не до конца реализован. Про контракты на конструкторы я уже писал
источник

AN

Alexander Nozik in Kotlin Community
источник

AN

Alexander Nozik in Kotlin Community
По сути позволяет использовать компаньенов как фабрики, которые можно генерить в одну строчку.
источник

BP

Bogdan Panchenko in Kotlin Community
Roman Elizarov
Когда компаньен используется "по делу", то всё хорошо - очень приятная фича. Проблема в том, что когда компаньён начинают испльзовать как замену статиков, то это уже не выглядит красиво — повяляется лишний уровень идентации, появляется ненужный экземпляр компаньона. Часто можно просто перетащить "статики" на верхний уровень, но это не работает если нужен доступ к приватным членам класса.
Возможно проблема в том что каждая третья статья, где сравниваю джаву и  котлина, был текст типа: в джаве статики, а в котлине есть компаньён
источник

SB

Sergey Barmin in Kotlin Community
Bogdan Panchenko
Возможно проблема в том что каждая третья статья, где сравниваю джаву и  котлина, был текст типа: в джаве статики, а в котлине есть компаньён
++ на собесах тоже часто это слышу
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
Возможно проблема в том что каждая третья статья, где сравниваю джаву и  котлина, был текст типа: в джаве статики, а в котлине есть компаньён
Ну это стандартное объяснение. И я в этом месте всегда объясняю, что это не правда.
источник

P

Phoenix in Kotlin Community
Alexander Nozik
Примерно понял, хотя пока я не видел это как проблему. Компаньены - очень мощная штука, потенцил которых, как мне кажется, еще не до конца реализован. Про контракты на конструкторы я уже писал
а какой потенциал у компаньеонов?  Что еще можно было бы реализовать?
источник

AN

Alexander Nozik in Kotlin Community
Phoenix
а какой потенциал у компаньеонов?  Что еще можно было бы реализовать?
Ну вот я выше писал. Компаньен может рабать как автоматическая фабрика. Довольно типичный кейс, когда у вас есть куча классов, которые надо генерить куда-нибудь в однородный список. Сейчас однородно генерить их нельзя, потому что нет возможности сделать интерфейс на конструктор. Народ делает всякой богомерзкой рефлексией (ничего не имею против рефлексией, но конкретно это ее использование - бяка). Это довольно клево решается тем, что компаньен наследует фабрику. Есть, разумеется ограничения, нужно явно эту фабрику наследовать. И еще там какие-то штуки, в которые я утыкался.
источник

AN

Alexander Nozik in Kotlin Community
Кстат Бреслва еще по тайп классам прошелся. Я сейчас окончательно убедился, что тайп классы в хаскелевом смысле (с байндингом по типам) - не то.
источник

М

Михаил in Kotlin Community
мб кто пояснит: нормально что вот этот код -
coroutineScope.launch {

       terminalFacade.getBatteryLevel()
           .collect { level ->
               viewState.updateValue {
                   it.copy(terminalBatteryLevel = level)
               }
           }
}


разврачивается в 2к+ строк байткода?
источник

(

( in Kotlin Community
Михаил
мб кто пояснит: нормально что вот этот код -
coroutineScope.launch {

       terminalFacade.getBatteryLevel()
           .collect { level ->
               viewState.updateValue {
                   it.copy(terminalBatteryLevel = level)
               }
           }
}


разврачивается в 2к+ строк байткода?
там где-то есть корутины?
источник

М

Михаил in Kotlin Community
terminalFacade.getBatteryLevel() это Flow<Int>
источник

AN

Alexander Nozik in Kotlin Community
Михаил
terminalFacade.getBatteryLevel() это Flow<Int>
Ну так они не декомпилируются нормально
источник

М

Михаил in Kotlin Community
Alexander Nozik
Ну так они не декомпилируются нормально
похоже на правду)
источник

AN

Alexander Nozik in Kotlin Community
раньше вообще декомпайлер подвешивало.
источник

М

Михаил in Kotlin Community
Alexander Nozik
раньше вообще декомпайлер подвешивало.
ну оно у меня на 4500к строк байткода остановилось)
источник