Comments 39
Рад, что Kotlin развивается, спасибо за новости. Полгода назад пробовал писать на Kotlin под Android, возникла проблема с несколькими конструкторами для кастомных
Решена ли каким-то образом эта проблема на текущем этапе развития?
View
: stackoverflow.com/questions/20670828/custom-android-views-with-kotlinРешена ли каким-то образом эта проблема на текущем этапе развития?
+6
А нет ли проблем у Kotlin с ART и Android L? Все-таки новый рантайм.
-2
Спасибо за статью, приятно видеть что хороший язык уверенно идет вперед. Когда-то пытался прикрутить его к андроиду, тогда еще с Ant, сейчас вижу все стало еще проще с Gradle (http://zserge.com/blog/kotlin.html).
Но честно скажу что тогда сильно не хватало документации.Вопрос может глупый, но скажите — а есть что-то типа JavaDocs по стандартным классам языка?
А еще очень надоедало что почти все Android-классы приходилось писать со знаком вопроса, т.к. в java любой объект может быть null. Вопрос — планируется ли какая-нибудь обертка над Android SDK чтобы разработчикам не приходилось постоянно сталкиваться с java interoperability?
Ну а в целом язык классный, молодцы!
Но честно скажу что тогда сильно не хватало документации.Вопрос может глупый, но скажите — а есть что-то типа JavaDocs по стандартным классам языка?
А еще очень надоедало что почти все Android-классы приходилось писать со знаком вопроса, т.к. в java любой объект может быть null. Вопрос — планируется ли какая-нибудь обертка над Android SDK чтобы разработчикам не приходилось постоянно сталкиваться с java interoperability?
Ну а в целом язык классный, молодцы!
+1
Пару месяцев назад в Kotlin уже были аннотации для Android SDK, если мне не изменяет память.
0
UFO just landed and posted this here
Первой серьезной попыткой решить этот вопрос было написание kannotator-а который анализировал методы на предмет null-абельности и записывал эту информацию во внешние xml-аннотации, который kotlin-компилятор потом использовал. Но из за неудобства, как я слышал, от этого подхода решили отказаться, что придет им на замену я не знаю.
+1
К слову об изначальной задаче — найти приложение для учета времени, затраченного на разные проекты.
Тоже занялся этой задачей, и первое же найденное приложение меня вполне устроило — play.google.com/store/apps/details?id=com.toggl.timer
Тоже занялся этой задачей, и первое же найденное приложение меня вполне устроило — play.google.com/store/apps/details?id=com.toggl.timer
0
Тут, по традиции, назойливый вопрос про С++ IDE
+11
Это крайне забавный оффтопик, он есть во всех постах JetBrains и всегда в плюсе.
+1
По традиции ответ — пока новостей нет. Мы очень хотим выпустить public EAP как можно быстрее. Но нам есть еще, над чем поработать (фидбека с приватного превью мы собрали уже достаточно). Особенно в плане перфоманса. Как будем сами удовлетворены результатом, так выпустим. Предположительно, это случится осенью. Точнее — пока не могу сказать.
0
А что слышно о поддержке c++ в решарпере?
0
Public EAP есть, можно пробовать — www.jetbrains.com/resharper/features/cpp.html
0
На Kotlin я смотрел мельком — мне его рекомендовали как замену Scala, но при быстром взгляде преимуществ я не заметил.
Правильно я понимаю, что when — это pattern matching? На сколько полноценно он реализован? Есть ли вложенные патерны? Как описываются алгебраические типы данных?
Правильно я понимаю, что when — это pattern matching? На сколько полноценно он реализован? Есть ли вложенные патерны? Как описываются алгебраические типы данных?
+1
В контексте Android преимущества есть: намного меньше стандартная библиотека.
+1
when — это не pattern matching. Скорее продвинутый switch из java. А with это вообще функция:
fun <T, R> with(receiver:T, f:T.()->R):R = receiver.f()
+1
Ну pattern matching тоже в каком-то роде продвинутый switchю
with по этому коды я воспринял как локальный import в Scala. Теперь начинаю путаться… ;-)
T.()-> R — это ссылка на метод класса T? И этот метод генерируется при компиляции создании этой ссылки?
with по этому коды я воспринял как локальный import в Scala. Теперь начинаю путаться… ;-)
T.()-> R — это ссылка на метод класса T? И этот метод генерируется при компиляции создании этой ссылки?
0
T.()-> R
— это тип "extention function класса T. Т.е. можно передать функцию (лямбду), которая будет работать в контексте класса T как будто это его extension method. При компиляции, да, хотя наверное генерируется это не совсем то слово. Сделано для удобства работы в ide и всяких плюшек вроде билдеров, ну и во-первых, это красиво!+1
мне его рекомендовали как замену Scala, но при быстром взгляде преимуществ я не заметилДва основных преимущества — в пороге вхождения и в читаемости кода «условным джуниором».
+2
Понятно.
Это мне уже давно не важно :-).
Это мне уже давно не важно :-).
-1
Что, читаемость тоже? Вы пишете одноразовые проекты, которые никому не показываете?
+1
Дальше будем предполагать, что все, кто пожелает попробовать Kotlin в деле под Android, будут использовать IntelliJ IDEA. Для работы понадобится установить плагин Kotlin и позаботиться, чтобы на компьютере были gradle и Android SDK (это к Kotlin'y отношения не имеет, это надо для разработки под Android на чем угодно).
Попробовал слёту пощупать руками, хотя ни разу не java-программер и вообще не в этой теме.
Скачал себе под Windows XP (git и какие-то jre у меня уже были)
* download-cf.jetbrains.com/idea/ideaIC-13.1.4b.exe — последний IntelliJ IDEA Community edition
* dl.google.com/android/installer_r23.0.2-windows.exe — последний Android SDK
* downloads.gradle.org/distributions/gradle-2.0-all.zip — последний gradle
позапускал инсталляторы, в замеченном после этого дела Android SDK Manager повключал галочки у последних версий чего-то там, подтвердил согласие, и он долго чего-то там качал и ставил.
gradle распаковал виде папки C:\gradle-2.0
Пытался открыть проект из репозитория. Указал логин и путь на гитхабе, сказал давай в C:\Temp\ и оно скачало проект и спросило, чем и как импортировать проект.
Я сказал про Gradle, в окошке импорта проекта сказал что у меня локальный он есть, и получил сообщение, что нет экзешника C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 13.1.4\jre\bin\java.exe. Оказалось, что он лежит на уровень глубже, в C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 13.1.4\jre\jre\bin
Переложил всю начинку там уровнем выше, сочтя jre\jre\ ошибкой инсталлятора.
После этого gradle из-под IntelliJ завёлся, что-то долго делал, что-то докачивал кажись, а потом сказал
You are using an unsupported version of Gradle. Please use version 1.10.
Please point to a supported Gradle version in the project's Gradle settings or in the project's Gradle wrapper (if applicable.)
Consult IDE log for more details (Help | Show Log)
Кстати, до этого Help | Show Log не добраться, не открыв какого-нибудь проекта, хотя бы нового. Пришлось сделать, чтоб заглянуть. Этот пункт меню открыл мне папку C:\Documents and Settings\\.IdeaIC13\system\log
Я попробовал выбрать не локальную gradle, а customizable gradle wrapper, около которого что-то про gradle 1.7, и он попёр сам скачивать services.gradle.org/distributions/gradle-2.0-bin.zip
Результата не дождался, сам скачал 1.1 поменяв цифры в адресе, распаковал рядом с 2.0. Попробовал опять локальным дистрибутивом. Несколько раз он отваливался при скачке чего-то из maven.com, я повторял заход, надеясь, что он скачанное где-то кеширует.
В итоге облом — нужна не 1.1, а 1.10 (зря округлил, забыл что это не число)
Скачал 1.10. Она опять долго скачивала всякое, нужное проекту, и в итоге сказала так:
Could not read script 'C:\Temp\Kotime\kotime\signing.gradle' as it does not exist.
В общем, так пока ничего посмотреть не удалось. (
0
signing.gradle — это файл вот такого вида:
По очевидным причинам на github он не выложен, как и файл release.keystore. Как создать ключ для подписи и как положить его в файл release.keystore, как раз и написано по ссылке на stackoverflow в статье.
android {
...
signingConfigs {
release {
storeFile file("release.keystore")
storePassword "******"
keyAlias "******"
keyPassword "******"
}
}
}
По очевидным причинам на github он не выложен, как и файл release.keystore. Как создать ключ для подписи и как положить его в файл release.keystore, как раз и написано по ссылке на stackoverflow в статье.
+2
Да, собственно плагин Kotln я скачал и установил средствами самой IntelliJ, найдя его среди плагинов от JetBrains
0
При неустойчивом интернете, удручает неинформативное отображение прогресса скачивания этим customizable gradle wrapper файла services.gradle.org/distributions/gradle-2.0-bin.zip — непонятно, качает ли он, ждёт ли чего, умеет ли докачивать и ввобще, сколько осталось. Ползут диагональные полоски по вроде-бы полосе прогресса, и всё тут… понимай как хочешь. И нажатая отмена долго висит, прежде чем отмениться.
0
Спасибо за статью. Почти 2 года назад я попробовал писать одно приложение под android не на java. В результате ничего не вышло и пришлось все таки использовать ненавистную. Так вот одна из альтернатив была связка maven+kotlin(m5)+intellij но к сожалению ничего не вышло. Скажите а как сейчас обстоят дела в сфере дружбы kotlin и систем сборок при нацеливании на android? Скажите насколько вообще kotlin готов к продакшену?
0
Отвечу как пользователь котлина с версии 0.1 и на java, и на js:
у меня вот не заладился простой проект с gradle, то есть проблемы решить можно, но не прямым путем и удовольствия мало. Да и плагин gradle в IDEA далек от совершенства.
Учитывайте, что Котлин постоянно развивается, и что в production, что в своем проекте хранить компилятор/плагин нужно у себя под VCS, дабы избавить своих коллег или себя через n времени от ужаса «как же скомпилировать теперь именно той самой версией на момент последнего изменения кода».
надо отметить, что такого удовольствия в написании кода в IDE как в случае java/typescript, не будет — довольно медленно оно работает (completion — в результате больше печатаешь, пока оно догоняет, inspections — довольно бедный набор и не всегда логичный).
То есть в целом Kotlin еще не продукт, но качество и продуманность языка столь высока, что за возможность писать код, как думаешь (без оглядки на компилятор и курения спеки), можно и пожертвовать многим (тут не столько удовольствие, его в долларах не измеришь и всегда можно адаптироваться, сколько результирующая экономия времени на первоначальном программировании и дальнейшей поддержке).
Ну а в runtme — если оно сразу не упало (компилятор может выдать байт-код некорректный в случае interop с существующим java кодом (такие проблемы редки, но пока что есть)), то проблем уже не будет.
сфере дружбы kotlin и систем сборок при нацеливании на android
у меня вот не заладился простой проект с gradle, то есть проблемы решить можно, но не прямым путем и удовольствия мало. Да и плагин gradle в IDEA далек от совершенства.
Учитывайте, что Котлин постоянно развивается, и что в production, что в своем проекте хранить компилятор/плагин нужно у себя под VCS, дабы избавить своих коллег или себя через n времени от ужаса «как же скомпилировать теперь именно той самой версией на момент последнего изменения кода».
насколько вообще kotlin готов к продакшену?
надо отметить, что такого удовольствия в написании кода в IDE как в случае java/typescript, не будет — довольно медленно оно работает (completion — в результате больше печатаешь, пока оно догоняет, inspections — довольно бедный набор и не всегда логичный).
То есть в целом Kotlin еще не продукт, но качество и продуманность языка столь высока, что за возможность писать код, как думаешь (без оглядки на компилятор и курения спеки), можно и пожертвовать многим (тут не столько удовольствие, его в долларах не измеришь и всегда можно адаптироваться, сколько результирующая экономия времени на первоначальном программировании и дальнейшей поддержке).
Ну а в runtme — если оно сразу не упало (компилятор может выдать байт-код некорректный в случае interop с существующим java кодом (такие проблемы редки, но пока что есть)), то проблем уже не будет.
0
На правах рекламы хотел бы упомянуть генератор, который умеет создавать внутренний Kotlin DSL для UI (и не только) библиотек.
Например, с помощью такого DSL интерфейс можно описывать следующим образом:
Более крупные примеры можно посмотреть здесь.
Например, с помощью такого DSL интерфейс можно описывать следующим образом:
// android
scrollView {
layoutParams(MATCH_PARENT, MATCH_PARENT)
linearLayout {
layoutParams(MATCH_PARENT, MATCH_PARENT)
orientation = VERTICAL
textView {
linearLayoutParams(MATCH_PARENT, WRAP_CONTENT) {
bottomMargin = 15.dp
}
text = getString("description")
}
}
}
// javafx
gridPane {
alignment = CENTER
hgap = 10.0
vgap = 10.0
padding = Insets(25.0)
text(column = 0, row = 0, colspan = 2, rowspan = 1) {
text = "Welcome"
font = Font.font("Tahoma", FontWeight.NORMAL, 20.0)
}
}
Более крупные примеры можно посмотреть здесь.
+2
Да это же практически Scaloid только круче и на Kotlin! Спасибо, добрый человек, отзывчивых вам пользователей и легких багфиксов!
И сразу каверзный вопрос, а что с ActionBar, support классами и т.д? Потому что тот же скалоид застрял в этохе андроида 2.х без фрагментов.
И сразу каверзный вопрос, а что с ActionBar, support классами и т.д? Потому что тот же скалоид застрял в этохе андроида 2.х без фрагментов.
0
Сперва в общих чертах опишу принцип работы генератора, а потом перейду непосредственно к ответам на вопросы.
Генератору на вход подаются корни генерации, а также информация об отношениях контейнер-объект. Генератор на основе этих данных выдает классы на Котлине, где исходные сеттеры и геттеры слиты в свойства, созданы билдеры на основе этих свойств, подставлены типы, а также сгенерированы функции, позволяющие описывать вложенность объектов.
Немного раскрою термины и укажу примеры.
Корень генерации — такой класс, для наследников которого, а также него самого должны быть созданы классы-аналоги (например, javafx.scene.Node).
Отношение контейнер-объект — такая пара классов, что экземпляр одного класса можно «положить» в экземпляр другого (например, Node -> Pane в javafx).
Билдер — функция, позволяющая за один вызов создать и настроить объект. Создается она с использованием таких фич языка, как именованные аргументы и параметры по умолчанию.
Функции, позволяющие описывать вложенность объектов — это те же билдеры, но они уже являются методами контейнеров. Отличия от обычных билдеров заключаются в расширенном наборе параметров и умении класть объекты в контейнер.
Это я описал для лучшего понимания того, что вообще генератор делает.
Теперь к вопросам. Пока эксперименты проводились только с классом View в качестве корня генерации, но другие классы тоже можно пробовать, метод такой:
1) в корни добавляете интересующие классы
2) запускаете генерацию
3) компилируете сгенерированные исходники
4) в коде получаете экземпляр класса
5а) либо передаете его в конструктор классу
5б) либо с помощью функции ниже начинаете строить объект
Пример:
Вроде все должно получиться, и ActionBar, и support-классы, и фрагменты. Если что, пишите, будем разбираться :)
Генератору на вход подаются корни генерации, а также информация об отношениях контейнер-объект. Генератор на основе этих данных выдает классы на Котлине, где исходные сеттеры и геттеры слиты в свойства, созданы билдеры на основе этих свойств, подставлены типы, а также сгенерированы функции, позволяющие описывать вложенность объектов.
Немного раскрою термины и укажу примеры.
Корень генерации — такой класс, для наследников которого, а также него самого должны быть созданы классы-аналоги (например, javafx.scene.Node).
Отношение контейнер-объект — такая пара классов, что экземпляр одного класса можно «положить» в экземпляр другого (например, Node -> Pane в javafx).
Билдер — функция, позволяющая за один вызов создать и настроить объект. Создается она с использованием таких фич языка, как именованные аргументы и параметры по умолчанию.
Функции, позволяющие описывать вложенность объектов — это те же билдеры, но они уже являются методами контейнеров. Отличия от обычных билдеров заключаются в расширенном наборе параметров и умении класть объекты в контейнер.
Это я описал для лучшего понимания того, что вообще генератор делает.
Теперь к вопросам. Пока эксперименты проводились только с классом View в качестве корня генерации, но другие классы тоже можно пробовать, метод такой:
1) в корни добавляете интересующие классы
2) запускаете генерацию
3) компилируете сгенерированные исходники
4) в коде получаете экземпляр класса
Abc
5а) либо передаете его в конструктор классу
kotlin.dsl.Abc
и настраиваете через свойства или with
5б) либо с помощью функции ниже начинаете строить объект
public fun Abc.dsl(init: kotlin.dsl.Abc.() -> Unit) {
kotlin.dsl.Abc(this).init()
}
Пример:
getActionBar().dsl {
homeButtonEnabled = true
...
}
Вроде все должно получиться, и ActionBar, и support-классы, и фрагменты. Если что, пишите, будем разбираться :)
0
Удивительно, кстати, что ни в Java, ни в Kotlin'e до сих пор нет метода secondsToHumanReadableString, преобразующего целое число секунд в строку формата
ЧЧ: ММ: СС.
Для решения похожих задач есть библиотека Humanizer.jvm, правда желаемой автором поста функциональности там еще, вроде, нет. Прокт написан на Котлине, но может быть использован и в Java проекте.
P.S. проект не мой.
0
Sign up to leave a comment.
Пишем на Kotlin под Android