@kotlin_lang

Страница 888 из 982
Александр
25.09.2018
10:16:33
Здравствуйте! Как же правильно определить константу? Студия постоянно подсказывает, что val может быть const, но для чего нам обьект который скомпилируется и будет находиться в памяти на протяжении всего жизненного цикла приложения, даже если мы не обратимся к нему? С другой стороны, если мы пишем val STR = "some_str", то при каждом создании класса STR будет пересоздана. Тут можно отправить нашу "константу" в компаньон. Но студия предложит добавить const... Компаньон сгенерирует больше байткода, по этому (кажется) лучше использовать object, что не всегда необходимо. Выходит, можно вынести на топ левел, что вообще взрывает мозг, потому, что мы привыкли обьявлять константы внутри класса, чтобы понимать контекст. А тут константа как бы без скоупа и можно еще const добавить. Простыми словами, мы тут столько копий сломали, скоро ругаться начнем. Подскажите, пожалуйста, как правильно пользоваться такими классными инструментами?

Quantum Harmonizer
25.09.2018
10:20:52
Здравствуйте! Как же правильно определить константу? Студия постоянно подсказывает, что val может быть const, но для чего нам обьект который скомпилируется и будет находиться в памяти на протяжении всего жизненного цикла приложения, даже если мы не обратимся к нему? С другой стороны, если мы пишем val STR = "some_str", то при каждом создании класса STR будет пересоздана. Тут можно отправить нашу "константу" в компаньон. Но студия предложит добавить const... Компаньон сгенерирует больше байткода, по этому (кажется) лучше использовать object, что не всегда необходимо. Выходит, можно вынести на топ левел, что вообще взрывает мозг, потому, что мы привыкли обьявлять константы внутри класса, чтобы понимать контекст. А тут константа как бы без скоупа и можно еще const добавить. Простыми словами, мы тут столько копий сломали, скоро ругаться начнем. Подскажите, пожалуйста, как правильно пользоваться такими классными инструментами?
> будет находиться в памяти на протяжении всего жизненного цикла приложения нет > при каждом создании класса STR будет пересоздана это что за создание класса такое?

Александр
25.09.2018
10:22:14
class C { private val B = “b”. } для каждого инстанса С создается инстанс B

Google
Александр
25.09.2018
10:22:50
val это константа?

Quantum Harmonizer
25.09.2018
10:22:53
class C { private val B = “b”. } для каждого инстанса С создается инстанс B
экземпляр строки будет один, а вот поле с указателем на него будет для каждого экземпляра C

Дмитрий
25.09.2018
10:23:17
val это финальная переменная

по аналогии с java

Александр
25.09.2018
10:26:36
val это финальная переменная
ок, по аналогии с джавой, как сделать private final static STR =“str”; константу?

Дмитрий
25.09.2018
10:26:53
companion object

Александр
25.09.2018
10:27:08
или object ок

Quantum Harmonizer
25.09.2018
10:27:19
или top-level

Александр
25.09.2018
10:27:33
вот тут в чем разница? топ левел или компанион?

Quantum Harmonizer
25.09.2018
10:27:52
top-level == static, companion == singleton

Иван
25.09.2018
10:27:59
Такс

Почему у sealed нет .copy метода?

Quantum Harmonizer
25.09.2018
10:28:25
Почему у sealed нет .copy метода?
а почему должен быть и что он должен копировать?

Google
Mi
25.09.2018
10:28:35
вот тут в чем разница? топ левел или компанион?
на топ левеле константы только примитивы и string и то с указанием модификатора const

Quantum Harmonizer
25.09.2018
10:29:32
Товарищи, такой вопрос. Есть стопицот способов передать/получить одно жалкое значение: его можно сунуть в JDBC или SQLite или забрать оттуда, записать в стрим или прочитать из него, записать в key-value и прочитать из них. Для всего этого есть несколько интерфейсов. Есть, допустим, структура, где у каждого поля есть такой конвертер. Компайл-тайм мне не может гарантировать, что Converter будет не просто converter, а, например, JdbcConverter. Было бы что-то такое, чего в котлине нельзя: object SomeTable : Table<<T> JdbcConverter<T>> { // йо, дженерики над дженериками val Name = string col "name" // конвертер + имя val Age = byte col "age" } Как лучше поступить? a) тупо принимать всюду Converter и кастить; одним конвертером реализовывать все возможные интерфейсы б) завести какой-нибудь ConverterProvider и просить provider.please(JdbcConverter::class.java), соответственно, разные конвертеры аггрегировать в) свой вариант?..

Александр
25.09.2018
10:29:44
а как приминять const?

Иван
25.09.2018
10:29:47
Mi
25.09.2018
10:31:23
Александр
25.09.2018
10:31:34
не понятно для чего const

в доке написано, константа времени компиляции

как это применить?

Andrey
25.09.2018
10:31:52
Здравствуйте! Как же правильно определить константу? Студия постоянно подсказывает, что val может быть const, но для чего нам обьект который скомпилируется и будет находиться в памяти на протяжении всего жизненного цикла приложения, даже если мы не обратимся к нему? С другой стороны, если мы пишем val STR = "some_str", то при каждом создании класса STR будет пересоздана. Тут можно отправить нашу "константу" в компаньон. Но студия предложит добавить const... Компаньон сгенерирует больше байткода, по этому (кажется) лучше использовать object, что не всегда необходимо. Выходит, можно вынести на топ левел, что вообще взрывает мозг, потому, что мы привыкли обьявлять константы внутри класса, чтобы понимать контекст. А тут константа как бы без скоупа и можно еще const добавить. Простыми словами, мы тут столько копий сломали, скоро ругаться начнем. Подскажите, пожалуйста, как правильно пользоваться такими классными инструментами?
val - неизменяемое поле. const val - неизменяемое singleton поле (top level или поле top level/static/companion объекта), которое может быть вычислено ещё на этапе компиляции.

Konstantine
25.09.2018
10:32:29
Ну мне бы sealed data class
Как у тебя Sealed класс узнает, что и кому из потомков надо при копировании

Алексей
25.09.2018
10:32:34
Здравствуйте! Как же правильно определить константу? Студия постоянно подсказывает, что val может быть const, но для чего нам обьект который скомпилируется и будет находиться в памяти на протяжении всего жизненного цикла приложения, даже если мы не обратимся к нему? С другой стороны, если мы пишем val STR = "some_str", то при каждом создании класса STR будет пересоздана. Тут можно отправить нашу "константу" в компаньон. Но студия предложит добавить const... Компаньон сгенерирует больше байткода, по этому (кажется) лучше использовать object, что не всегда необходимо. Выходит, можно вынести на топ левел, что вообще взрывает мозг, потому, что мы привыкли обьявлять константы внутри класса, чтобы понимать контекст. А тут константа как бы без скоупа и можно еще const добавить. Простыми словами, мы тут столько копий сломали, скоро ругаться начнем. Подскажите, пожалуйста, как правильно пользоваться такими классными инструментами?
Как по мне, константа и должна быть конст:)

Александр
25.09.2018
10:33:05
Как по мне, константа и должна быть конст:)
было бы супер-однозначно, хочешь константу пиши const

Алексей
25.09.2018
10:33:37
ну вот¯\_(ツ)_/¯

Maxim
25.09.2018
10:34:20
было бы супер-однозначно, хочешь константу пиши const
val - это не обязательно константа, это просто readonly поле, которое может и измениться. const гарантирует неизменность

Andrey
25.09.2018
10:34:44
как это применить?
Общий принцип такой: если идентификатор может быть сделан const - лучше сделать const, чтобы в рантайме значение даже не вычислять (результат const выражения подставится компилятором)

Алексей
25.09.2018
10:34:51
Даже если у вас в приложении будет тысяча конст чисел и тысяча конст строк - это будет не так много, учитывая, сколько у обычного приложения под то же ведро в памяти ресурсов лежит

Vladimir
25.09.2018
10:35:25
как это применить?
Можно в аннотациях использовать, а не const - нельзя

Maxim
25.09.2018
10:36:25
как это применить?
еще из полезных применений - будут вырезаны блоки кода, которые точно не будут выполнены исходя из этих констант

Иван
25.09.2018
10:37:25
Как у тебя Sealed класс узнает, что и кому из потомков надо при копировании
Ну мне бы какой-то workround для: sealed class SomeType { abstract val status: SomeStatus } data class SubtypeInt( override val status: SomeStatus value: Int ): SomeType() data class SubtypeTwo( override val status: SomeStatus value: Long ): SomeType() fun do(someType: SomeType): SomeType = someType.copy(status = SomeStatus.SUCCESS)

Google
Andrey
25.09.2018
10:38:05
Сомнение в том, что const точно будет в памяти, даже если мы к нему не обратимся
Врядли. Если ты не дёргаешь top level декларацию, её class loader и не подгрузит скорее всего.

Konstantine
25.09.2018
10:38:28
Напиши свою реализацию copy у SomeType и там разруливай.

Или абстрактный

А, опоздал

Иван
25.09.2018
10:39:14
Напиши свою реализацию copy у SomeType и там разруливай.
Ну там просто smartcast и copy для каждого

Konstantine
25.09.2018
10:39:48
Ну там просто smartcast и copy для каждого
А если появится третий наследник с value: String?

Не проси от компилятора невозможного)

Александр
25.09.2018
10:41:14
Врядли. Если ты не дёргаешь top level декларацию, её class loader и не подгрузит скорее всего.
я имед ввиду, то, что константа используется в коде (например, на каком то экране), но до нее может не дойти (экран не открыли)

Александр
25.09.2018
10:41:59
да

Maxim
25.09.2018
10:43:10
да
кажется, вы слишком беспокоитесь о его хранении. Не волнуйтесь, хранение на один примитив больше не вызовет OutOfMemory

Александр
25.09.2018
10:45:52
кажется, вы слишком беспокоитесь о его хранении. Не волнуйтесь, хранение на один примитив больше не вызовет OutOfMemory
проект не маленький, не понятно как может стрельнуть если вся команда станет активно использовать. в целом болеее менее подразобрался

Влад
25.09.2018
10:47:46
Объясните пожалуйста. Насколько знаю, что в котлин нет полей, есть свойства. Так чем же поле отличается от свойства?

Boris
25.09.2018
10:49:46
Может не быть за ними поля вообще

Алексей
25.09.2018
10:50:17
Свойства можно переопределять и делегировать

Andrey
25.09.2018
10:54:36
проект не маленький, не понятно как может стрельнуть если вся команда станет активно использовать. в целом болеее менее подразобрался
Активно это как? Команда активно наделает миллионы именованных констант целочисленных? Если что, const всегда примитив или строка. Другое не поддерживается.

Google
Andrey
25.09.2018
10:58:25
ну например, несколько тысяч
Ок. ~ десятков килобайт, если это int. Вам правда 10 кб кучи критично?

Александр
25.09.2018
11:00:12
Ок. ~ десятков килобайт, если это int. Вам правда 10 кб кучи критично?
тут вопрос несколько принципиальный: зачем тебе константа времени компиляции если ты ее в это время не используешь? обьяви например, через object или top level

Andrey
25.09.2018
11:00:18
Оно ничем не отличается от любого другого top level val кроме того факта, что компилятор прям в байт код зашил вычисленное значение левой части выражения.

Alexey
25.09.2018
11:02:18
делаешь абстактный метод и каждый наследник сам решает, что делать
На самом деле, нет ничего зазорного написать реализацию прямо в sealed class, так как компилятор проконтролирует что мы всё сделали ок

Andrey
25.09.2018
11:05:06
тут вопрос несколько принципиальный: зачем тебе константа времени компиляции если ты ее в это время не используешь? обьяви например, через object или top level
https://stackoverflow.com/questions/37482378/static-data-in-kotlin/37485356#37485356 Если верить этому, то const val компилируется в public static final, а просто top level val в private static final + синтетический геттер, так что разницы не много.

Есть ещё разница, как из Java доступ получать: к const val из Java можно обратиться напрямую. Для получения значения val из Java надо геттер использовать.

Admin
ERROR: S client not available

Alexandr
25.09.2018
11:21:57
экземпляр строки будет один, а вот поле с указателем на него будет для каждого экземпляра C
строки да, а если не примитив, то не один. и то в случае числе из пула констант подставится только -255 - 255

Quantum Harmonizer
25.09.2018
11:22:11
Сомнение в том, что const точно будет в памяти, даже если мы к нему не обратимся
Const-поле недостижимо. Его значение хранится в том классе, в котором используется. Впрочем, как и в Java.

Alexandr
25.09.2018
11:30:15
I
25.09.2018
11:30:40
ребят у кого-нибудь в android studio работает Show Kotlin ByteCode?

Александр
25.09.2018
11:32:48
да

I
25.09.2018
11:33:39
у меня студи 3.2 но там задизейблена кнопка, может какая магия нужна?)

Mikhail
25.09.2018
11:46:19
Товарищи, такой вопрос. Есть стопицот способов передать/получить одно жалкое значение: его можно сунуть в JDBC или SQLite или забрать оттуда, записать в стрим или прочитать из него, записать в key-value и прочитать из них. Для всего этого есть несколько интерфейсов. Есть, допустим, структура, где у каждого поля есть такой конвертер. Компайл-тайм мне не может гарантировать, что Converter будет не просто converter, а, например, JdbcConverter. Было бы что-то такое, чего в котлине нельзя: object SomeTable : Table<<T> JdbcConverter<T>> { // йо, дженерики над дженериками val Name = string col "name" // конвертер + имя val Age = byte col "age" } Как лучше поступить? a) тупо принимать всюду Converter и кастить; одним конвертером реализовывать все возможные интерфейсы б) завести какой-нибудь ConverterProvider и просить provider.please(JdbcConverter::class.java), соответственно, разные конвертеры аггрегировать в) свой вариант?..
А можешь еще раз сказать, чего бы тебе хотелось? Обозначить в компайл-тайм, что у тебя тут JdbcConverter?

Abai
25.09.2018
11:49:43
Хай ребят где можно взять парактику на язык котлин?

Abai
25.09.2018
11:52:19
ну ты через что писал код (видео докму книга)

Александр
25.09.2018
11:53:36
https://kotlinlang.org/docs/tutorials/koans.html

https://try.kotlinlang.org/#/Kotlin%20Koans/Introduction/Hello,%20world!/Task.kt

Google
Vadim
25.09.2018
12:14:19
Эм, не подскажете как я могу использовать URL обьект в Kotlin'e? Нужно преобразовать .load(new URL("someUrl")

I
25.09.2018
12:43:29
ребята как такую конструкцию корректно переписать на котлин если hashmap может быть равен null — hashmap.size() > 0 ? я сделал так hashmap?.size?.compareTo(0) == 0 но это как-то криво))

I
25.09.2018
12:45:38
hashmap?.size == 0
Спасибо, а почему на такую он ругается hashmap?.size > 0?

Andrew
25.09.2018
12:46:27
Спасибо, а почему на такую он ругается hashmap?.size > 0?
Потому что null и 0 сравнить на больше-меньше не выйдет.

Мне только такое в голову приходит: hashmap?.let { size > 0 } ?: false

I
25.09.2018
12:48:03
Потому что null и 0 сравнить на больше-меньше не выйдет.
так и это тогда бы было некорректно hashmap?.size == 0 сравнивать null == 0

Alexander
25.09.2018
12:48:36
Спасибо, а почему на такую он ругается hashmap?.size > 0?
Трансляция "==" предполагает nullable type (https://kotlinlang.org/docs/reference/equality.html#structural-equality) Трансляция операторов сравнения не предполагает (https://kotlinlang.org/docs/reference/operator-overloading.html#comparison)

Andrey
25.09.2018
12:48:41
так и это тогда бы было некорректно hashmap?.size == 0 сравнивать null == 0
Нет, проверить эквивалентность как раз корректно.

Andrew
25.09.2018
12:48:45
Ну или hashmap?.size ?: 0 > 0 как вариант, но это неочевидно.

Andrey
25.09.2018
12:50:10
Andrew
25.09.2018
12:51:28
Andrew
25.09.2018
12:52:45
Кстати да, hashmap?.isNotEmpty() === true :)

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