Как стать автором
Обновить

Комментарии 13

НЛО прилетело и опубликовало эту надпись здесь
В данном случае как раз для author. Но вообще сами по себе именованные аргументы весьма полезны. Так, например, если есть набор параметров, и у всех есть значения по умолчанию, то можно указывать значения только для нужных. Пример:

fun someAction(repeat: Int = 1, timeout: Long = 1000, log: Boolean = false, action: () -> Unit) {
   // -----
}

//use 1
someAction(repeat = 3) {
   println("Hi!")
}

//use 2
someAction(timeout  = 5000, log = true) {
   println("Message, after timeout")
}
НЛО прилетело и опубликовало эту надпись здесь

Все хорошо, но именно так в java тоже уже не пишут. Есть ломбок, есть другие способы.


Кроме того, fluent API (в виде builder скажем) далеко не всегда такой простой и очевидный, как у вас в примере. И не заменяется просто именованными параметрами.

Kotlin позволяет убрать ненужные оборачивания в класс при помощи функций верхнего уровня.


А такие функции можно переиспользовать
А такие функции можно переиспользовать

Если под переиспользовать подразумевается переопределить, то ответ — нет.

Функция верхнего уровня в Kotlin:
fun test(): Unit {}   // in file Test.kt

В Java будет выглядеть в виде следующего:
public final class TestKt {
   public static final void test() {
   }
}

А в Java статичные функции переопределять нельзя, как и в Kotlin.
извиняюсь, отправил раньше чем дописал, а отредактировать не могу, имел ввиду переиспользовать в других классах, где они явно не объявлены, например в классе A определили
fun String.countAmountOfX(): Int {
    return length - replace("x", "").length
}


могу ли я в классе B вызвать ее у какой либо строки?
Если такая функция будет в классе A то это уже обычная функция класса (точнее в том виде как у вас это еще и функция расширение). В таком виде ее нельзя будет напрямую использовать в классе B.

Но если вы такую функцию объявите не в классе (или скажем в объекте или объекте компаньоне) то такую функцию можно будет вызвать:
Пример 1 с функцией верхнего уровня:
файл test/A.kt:
package test

fun String.countAmountOfX(): Int {
    return length - replace("x", "").length
}

файл test/B.kt:
package test

class B {
    fun testCall(): Unit {
        "asdf".countAmountOfX()
    }
}

Пример 2 с объектом компаньоном:
файл test/A.kt:
package test

class A {
    companion object {
        fun String.countAmountOfX(): Int {
            return length - replace("x", "").length
        }
    }
}

файл test/B.kt:
package test

import test.A.Companion.countAmountOfX

class B {
    fun testCall(): Unit {
        "asdf".countAmountOfX()
    }
}

Пример 3 с функцией в объекте:
файл test/A.kt:
package test

object A {
    fun String.countAmountOfX(): Int {
        return length - replace("x", "").length
    }
}

файл test/B.kt:
package test

import test.A.countAmountOfX

class B {
    fun testCall(): Unit {
        "asdf".countAmountOfX()
    }
}

Надеюсь что ответил на ваш вопрос.
спасибо большое, мог бы лайкнуть сделал бы это!

Категорически поддерживаю:


Избегайте проверок типов

Вот только почему после этого идёт as?, ведь это и есть проверка типа.

это попытка приведения типа
Проверка типа или попытка приведения — суть та же. Это нарушение принципа подстановки. Я понимаю, что есть море плохо спроектированных апи, но введение такого сахара дает стимул писать их еще больше.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий