
Михаил
11.07.2017
15:23:45
companion object {
val app by lazy { this@Application }
}
Хоте нет))

Igor
11.07.2017
15:24:41
Хоте нет))
Я было подумал, что от меня скрыли часть языка ?

Михаил
11.07.2017
15:24:53
А что тут такого?

Google

Михаил
11.07.2017
15:25:17
Разве что из компаниона не обратьться к зис

Igor
11.07.2017
15:25:30

Михаил
11.07.2017
15:26:24
Там сабака стоит
Но тут это не спасет

Igor
11.07.2017
15:27:50
Вот именно что скомпилируется только
val app by lazy { this@Companion }
В общем окей, что бы со стороны оно виделось как val - заюзаю 2 поля

Михаил
11.07.2017
15:30:00
Есть мысль сделать свой делегат в котором можно будет сэтить контекст
object AppInstanceHolder {
getValue...
init(app:App)
}
Но на деле ничем от двух полей не отличается кроме неявности лишней

Boris
11.07.2017
15:35:34
думаю есть только два способа скрыть что проперти var это за другим полем или за интерфейсом

Михаил
11.07.2017
15:44:35
Вообще читал в заметкам к одному из пререлизов котлина что есть планы по lateinit val, но это не будет лейтинит вал (если ничего не путаю)

Boris
11.07.2017
17:01:25
а вот кто-нибудь знает, почему нельзя вот так написать?
var clientId: String
override get
set
я имею ввиду, если я имплементирую джавовский интерфейс с методом String getClientId(), то было бы здорово иметь возможность пропертю обявить так, чтобы геттер оверрайдил этот метод

Google

Михаил
11.07.2017
17:03:09

Boris
11.07.2017
17:03:30
т.е. вроде очевидная фигня, но не работает

Михаил
11.07.2017
17:04:36

Igor
11.07.2017
17:05:09

Boris
11.07.2017
17:05:11
?

Igor
11.07.2017
17:06:59
Вот про простые аксессоры что-то написано https://discuss.kotlinlang.org/t/custom-getter-setter-for-properties-created-by-type-params/46/5

Михаил
11.07.2017
17:07:02
не понял
ну в котлин просто методы и get/set для проперти имеют разную природу, соответственно они не могут заменять друг друга, и при реализации интерфейса его метод должен был переопределен независимо от пропертей

Руслан
11.07.2017
17:07:27

Igor
11.07.2017
17:07:37
https://kotlinlang.org/docs/reference/classes.html#overriding-properties
А это доки

Михаил
11.07.2017
17:10:03

Boris
11.07.2017
17:11:28
https://youtrack.jetbrains.com/issue/KT-6653

Igor
11.07.2017
17:11:42

Boris
11.07.2017
17:27:47
Интересно, что Андрей Бреслав в этом ишью не дает внятного ответа про то какими собственно рисками чревата такая функциональность

Михаил
11.07.2017
17:30:34

Boris
11.07.2017
17:31:07
ну да, он так и пишет, что работать это может только так: a function can override a property, and a property can override a function
но в чем собственно проблема не до конца понятно, возможно это может паламать существующий код, конечно, но так вот с ходу непонятно

Google

Михаил
11.07.2017
17:32:19
Ну а вообще, как я писал выше, "методы и get/set для проперти имеют разную природу", тут в принципе такой подход использовать нелогично

Boris
11.07.2017
17:32:20

Михаил
11.07.2017
17:32:46
ну и ты как бы переопределяешь метод интерфейса, даже не думая, что это еще и геттер у проперти
еще раз говорю, "методы и get/set для проперти имеют разную природу", поэтому они используются и воспринимаются (по умолчанию) как разные вещи, и мешать их друг с другом лично я бы не стал

Boris
11.07.2017
17:35:57
ведь в других местах они с ними совместимы

Михаил
11.07.2017
17:39:35
то, что в джаве что-то можно, еще не значит, что это хорошо

Boris
11.07.2017
17:41:17
иначе это был бы треш

Михаил
11.07.2017
17:41:38

Boris
11.07.2017
17:42:12
это будет уже другой тип
это будет как раз джавовский String, так что если говорить строго то в котлине можно писать null в джавовый String

Михаил
11.07.2017
17:43:41
ну а вообще, Бреслав сколько уже раз говорил, что в котлине "все explicit", взаимозаменяемость геттера и наследуемого от интерфейса метода не очень explicit, когда нужно этот метод переопределить

Boris
11.07.2017
17:44:16
мы ведь говорить про совместимость, я не стану спорить, что без такой фичи языка как таковой можно было бы и обойтись, даже лучше было бы обойтись, чтобы концепцию пропертей не размывать, но вот в контексте совместимости с джавой этот вопрос уже не такой однозначный

Михаил
11.07.2017
17:45:24

Boris
11.07.2017
17:46:33

Михаил
11.07.2017
17:47:54

Google

Boris
11.07.2017
17:47:54

Михаил
11.07.2017
17:50:41

Boris
11.07.2017
17:52:54
ты этот override в наследнике не сразу увидишь, кроме того, какой-нибудь другой человек может потом пару часов потратить, чтобы понять, почему у него проперти неправильно работает, когда он всего лишь переопределил метод интерфейса
ну это не повод, если ты не видишь что метод переопределен, то не важно проперти это или нет, ты попадаешь в ситуацию, когда ты не понимаешь, почему у тебя не такое поведение, которое ты ожидаешь
однако переопределение как таковое существует

Михаил
11.07.2017
17:54:36
ну это не повод, если ты не видишь что метод переопределен, то не важно проперти это или нет, ты попадаешь в ситуацию, когда ты не понимаешь, почему у тебя не такое поведение, которое ты ожидаешь
Кстати, в джаве аксессоры являются методами и рассматриваются как методы, в котлине же аксессоры методами не являются (и как методы не рассматриваются), поэтому переопределять аксессор с помощью метода и метод с помощью аксессора нелогично как минимум. Правда, я уже повторяюсь

Boris
11.07.2017
17:56:19
в котлине это тоже методы, просто привязанные к проперти, ты недвусмысленно задаешь их при определении проперти

Михаил
11.07.2017
17:57:51
И вообще, Бреслав (или даже Жемеров) не раз говорил, что (примерно) если какая-то фича несет в себе какие-то неоднозначности, то они (разрабы котлина) несколько раз подумают, прежде чем вводить эту фичу в язык


Boris
11.07.2017
18:02:19
опять же я еще раз говорю, что это могло бы быть специальной аннотацией вроде @JvmAccessorOverride или типа того, которая бы давала возможность переопределить джавовский аксессор. И еще раз: я понимаю, что эта фича которая требует продумывания, просто хотелось услышать мотивацию, почему за это не берутся и пока я услашал только одну на мой взгляд важную причину, это что в языке пришлось бы делать возможность переопределять проперти-акцессор методом, потому что иначе не все кейзы были бы покрыты, но возможно эти кейзы лучше было бы запретить, чем запретить оверрайд как таковой

Admin
ERROR: S client not available

Михаил
11.07.2017
18:06:54
опять же я еще раз говорю, что это могло бы быть специальной аннотацией вроде @JvmAccessorOverride или типа того, которая бы давала возможность переопределить джавовский аксессор. И еще раз: я понимаю, что эта фича которая требует продумывания, просто хотелось услышать мотивацию, почему за это не берутся и пока я услашал только одну на мой взгляд важную причину, это что в языке пришлось бы делать возможность переопределять проперти-акцессор методом, потому что иначе не все кейзы были бы покрыты, но возможно эти кейзы лучше было бы запретить, чем запретить оверрайд как таковой
Ну если так, то вопрос с моей стороны: а кто-то разрабам котлина предлагал сделать эту фичу в виде аннотации? (просто если нет, то вполне возможно, что фича эта рассматривалась только именно как постоянная фича языка, а не как доп средство для интероперабилити типа @JvmStatic)

Boris
11.07.2017
18:10:00

Михаил
11.07.2017
18:11:09

Boris
11.07.2017
18:11:10
вцелом согласен с тем, что такая фича языка усложнила бы язык и это действительно нужно только как фича совместимости

Жабра
11.07.2017
19:05:41
Кто-нибудь, скажите мне, есть вариант обойти ограничение на то, что в функцию нельзя передавать var переменную?

Boris
11.07.2017
19:06:14
чо?
почему нельзя?

Жабра
11.07.2017
19:07:14
Вот так. .-. Говорит "к этому моменту эта переменная могла быть изменена, поэтому иди н***й".

Boris
11.07.2017
19:07:50
может пример кода?

Михаил
11.07.2017
19:07:57
наверное речь о nullable var, а функция принимает nonnull

Google

Boris
11.07.2017
19:08:00
наверное типы разные

Жабра
11.07.2017
19:08:24
В том-то и дело, что проверка на null проходит преждевременно.

Boris
11.07.2017
19:11:01
можно, да, если по-простому, то вот так:
fun test() {
var a:Int? = 10
a?.let { va ->
call(va)
}
}
fun call(a: Int) {
}

Михаил
11.07.2017
19:11:55
a!!
:)

Boris
11.07.2017
19:12:34
или так вот:
fun test() {
var a:Int? = 10
val va = a
if (va != null) {
call(va)
}
}
fun call(a: Int) {
}

Жабра
11.07.2017
19:12:40
A, я забыл там дописать в основном add
Но не важно

Михаил
11.07.2017
19:13:51
типы не совпадают
передаешь Int? в аргумент с Int

Жабра
11.07.2017
19:14:32
Проверяя, не является ли null

Михаил
11.07.2017
19:14:46
для var не работает смарткаст

Жабра
11.07.2017
19:14:59
И что делать?

Михаил
11.07.2017
19:15:02
поставь !!.

Жабра
11.07.2017
19:15:26
Окей

Boris
11.07.2017
19:15:39
data class A(var prop: Int? = null)
fun test() {
val a = A()
a.prop.let { prop ->
if (prop != null) {
call(prop)
} else {
somethingElse()
}
}
}
fun call(a: Int) {
}

Жабра
11.07.2017
19:16:23

Boris
11.07.2017
19:16:38
ой

Михаил
11.07.2017
19:16:40
но это вариант для плохих парней :D

Жабра
11.07.2017
19:17:05
А для "хороших"?