
DarkMentat
12.02.2018
11:39:16
те же все квикфиксы
это не то?

Andrew
12.02.2018
11:40:38
студийный статический анализ из какого-нибудь пре-коммит хука или на CI не запустить
а у некоторых качество кода на поток поставлено

Google

DarkMentat
12.02.2018
11:43:22
ээ

Kirill
12.02.2018
11:43:51

DarkMentat
12.02.2018
11:44:05
это просто тот самый линт, что градал делает

Даниил
12.02.2018
11:44:20

DarkMentat
12.02.2018
11:44:21
gradlew lint, он отчеты генерит
и он и со студии тоже умеет

Даниил
12.02.2018
11:45:13
нет никакого gradlew lint
из коробки
я не знаю откуда у тебя этот таск

Vladimir
12.02.2018
11:45:50

Даниил
12.02.2018
11:46:05
а, там какой-то свой линтер?
но вообще я не думаю что студия использует этот линт

Google

Vladimir
12.02.2018
11:47:46

Даниил
12.02.2018
11:49:17
лан, сорь тогда что ворвался в обсуждение тулинга для ондроеда, я в этом ничего не понимаю ?

Vladimir
12.02.2018
11:49:17

Даниил
12.02.2018
11:49:50
я на котлине не под ондроед пишу, поэтому не понял сначала о каком линтере вообще речь идёт

DarkMentat
12.02.2018
11:50:13
прост там не только андроид специфик, но и чисто котлиновские правила
и стандартные идейные окошни
думал, что общее...

Vladimir
12.02.2018
11:51:30
Ну так-то Kotlin != Android, так что упоминание его линтера весьма бесполезно в данном контексте.
А идея для headless режима требует проект в своём формате, так что многовато возни на CI

Evgenii
12.02.2018
12:03:54
Всем привет. Подскажите, как для переменных с lateinit отследить момент, когда эта переменная еще не инициализирована?

Andrew
12.02.2018
12:04:46
::varName.isInitialized

Evgenii
12.02.2018
12:06:59
Это вообще нормальная практика? Эта переменная указывает на список объектов, которые получаю с сервера. Когда я их получил, инициализирую. Обращаясь к ней в следующий раз, достаю эти данные из поля класса.

Anton
12.02.2018
12:07:34
а какой профит в таких переменных кроме случаев с DI нпример когда филд енджекшен
почему не сделать нуллабл?

Evgenii
12.02.2018
12:07:53
и правда.

Anton
12.02.2018
12:07:56
ну вот раньше не было этого метода isInitialized
тогда вроде как понятно что упадет в рантайме
а щас еще проверку ставить

Bogdan
12.02.2018
12:08:10

Andrew
12.02.2018
12:08:17
А оно под капотом в nullable и прерващается.

Google

Anton
12.02.2018
12:08:20
ну а тут не 256 раз проверят?

Sergey
12.02.2018
12:08:30

Bogdan
12.02.2018
12:08:58
Бывает иницилизация нужна не сразу, но есть варят делегаты

Andrew
12.02.2018
12:09:23
Просто если есть уверенность, что оно действительно проинициализируется где-то там в начале жизни объекта, но не совсем сразу, то можно скрасить себе жизнь отсутствием ?. по всему коду, взяв на себя ответственность за KotlinNPE.

Evgenii
12.02.2018
12:10:48

Andrew
12.02.2018
12:10:56
ну часто либо лейтинит, либо налы, выбирай что больше не нравится
кстати, а насколько чревато использование isInitialized? это уже рефлексия или нет?
надо бы наверное конвертнуть код в джаву и глянуть что там
нет, это сравнение с null в чистом виде

Bogdan
12.02.2018
12:11:01

Andrew
12.02.2018
12:11:18
Да на здоровье, я ж не отговариваю.

Anton
12.02.2018
12:11:24
какой ты крутой

You
12.02.2018
12:11:40

Andrew
12.02.2018
12:11:47
Яйца завидуют белой завистью ;)

Kirill
12.02.2018
12:13:33

Bogdan
12.02.2018
12:14:53

You
12.02.2018
12:15:29
Кеды?

Bogdan
12.02.2018
12:15:43
ну иcходя из анотаций: String? lateinit var k: String , не совсем одно и тоже

Google

Andrew
12.02.2018
12:17:07
Ноу щит, Шерлок, конечно String? и String -- это не одно и то же.

Kirill
12.02.2018
12:18:10
я нет

Andrew
12.02.2018
12:18:18
Ну всё, значит тебе тоже веры нет.

Kirill
12.02.2018
12:18:49
просто пару раз было забавно "хм, да не может же в компиляторе баги быть? это точно я что-то не так делаю"
а потом "хм, оказалось что таки в компиляторе"

Bogdan
12.02.2018
12:18:57

Денис
12.02.2018
12:19:02

Andrew
12.02.2018
12:19:22
Хех, бывает. Я, благо, пока не натыкался :)

Kirill
12.02.2018
12:19:57

Денис
12.02.2018
12:20:18

Anton
12.02.2018
12:20:20
вот и познакомились

Sergey
12.02.2018
12:21:48
О, сделали чтобы можно было котлин запускать в scratch файлах

Andrew
12.02.2018
12:22:03

Bogdan
12.02.2018
12:23:22
и проверки на нул в гетерах
так-что обычные nullable типы, могут быть лучшим решением

Andrew
12.02.2018
12:25:50
Исключительно для того, чтобы вмест KNPE кидать "property uninitialized". Я уже даже не говорю о том, что бранч предикшн на lateinit-ах должен успешно греться и не ошибаться, нивелируя проверку на налл вообще.
А вот касательно дополнительного класса -- не видел, да.

Bogdan
12.02.2018
12:27:02
а нет что-то бавил и появился

Sergey
12.02.2018
12:27:51
вроде hotspot делает хитрую проверку на налл, инструкции для проверки не генерятся. если null то падает в sigsegv, которая обрабатывается как тело if

Google

Sergey
12.02.2018
12:28:18
так что до бранч придикшена дело не дойдет )

Andrew
12.02.2018
12:28:50
Хм, занятно. И в обрабочике сигнала оно потом свой стек разматывает наряду с нативным?
Логично, в целом, эта оптимизация на пользовательский код не должна влиять.

Sergey
12.02.2018
12:29:23
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/os_cpu/linux_x86/vm/os_linux_x86.cpp#l396

Bogdan
12.02.2018
12:29:38
но это нужно оптимизировать, а до оптимизации дойти должно

Andrew
12.02.2018
12:30:33
Даже не хочу спрашивать, что ты этой фразой имел ввиду.

Bogdan
12.02.2018
12:31:30

Sergey
12.02.2018
12:33:04
насколько помню, эта оптимизация включается если в тело проверки попадаем в 0.01% случаев
вернее меньше чем 0.01%

Bogdan
12.02.2018
12:34:36
хотя тут хз

Andrew
12.02.2018
12:37:38
Я не понимаю, к чему весь этот разговор. У тебя либо наллабл-поле и ты расставляешь все проверки сам, либо lateinit и за тебя это делает компилятор. Даже для платформ-типа, превращённого в нонналл, будут эти проверки. Какое к этому отношение имеет цена проверки?

Bogdan
12.02.2018
12:39:54

Andrew
12.02.2018
12:40:24
Я всё ещё не увидел, чем хуже.

Bogdan
12.02.2018
14:09:28

Igor
12.02.2018
14:35:20
А почему нельзя сделать inline suspend функцию, которая вызывает suspend лямбды?

Kirill
12.02.2018
15:14:41

Bogdan
12.02.2018
17:13:48

Igor
12.02.2018
18:09:31
Те нет способа написать свою функцию, которая просто будет вызвать launch(UI), передавая туда лямбду?
А то переодически забываю UI передавать ?