
Александр
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 будет пересоздана
это что за создание класса такое?


Konstantin
25.09.2018
10:21:19

Александр
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

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

Александр
25.09.2018
10:26:36

Дмитрий
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

Google

Mi
25.09.2018
10:28:35


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


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


Александр
25.09.2018
10:33:05

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

Maxim
25.09.2018
10:34:20

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

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

Vladimir
25.09.2018
10:35:25

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

Александр
25.09.2018
10:36:55

Иван
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

Konstantine
25.09.2018
10:38:08

Maxim
25.09.2018
10:38:22

Konstantine
25.09.2018
10:38:28
Напиши свою реализацию copy у SomeType и там разруливай.
Или абстрактный
А, опоздал

Иван
25.09.2018
10:39:14

Konstantine
25.09.2018
10:39:48
Не проси от компилятора невозможного)

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

Maxim
25.09.2018
10:41:39

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

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

Александр
25.09.2018
10:45:52

Влад
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

Александр
25.09.2018
10:57:13

Google

Andrey
25.09.2018
10:58:25

Александр
25.09.2018
11:00:12

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

Alexey
25.09.2018
11:02:18

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

Admin
ERROR: S client not available

Alexandr
25.09.2018
11:21:57

Quantum Harmonizer
25.09.2018
11:22:11

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
Хай ребят где можно взять парактику на язык котлин?

Vladimir
25.09.2018
11:50:38

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")

Mi
25.09.2018
12:17:11

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

Maxim
25.09.2018
12:44:23

I
25.09.2018
12:45:38

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

I
25.09.2018
12:48:03

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

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

Andrey
25.09.2018
12:50:10

I
25.09.2018
12:50:56

Andrew
25.09.2018
12:51:28

Vladimir
25.09.2018
12:51:29

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