Разница между закрытой функцией расширения верхнего уровня и закрытой функцией расширения внутри класса - PullRequest
0 голосов
/ 20 февраля 2019

В настоящее время мы переключаем наш проект на Kotlin и натолкнулись на следующий вопрос:

Нам нужна определенная функция расширения только внутри данного класса.Таким образом, у нас есть две возможности: (1) Объявление функции расширения private на верхнем уровне файла или (2) Объявление функции расширения private внутри класса.

После MCVE:

Пример верхнего уровня (файл C1.kt):

private fun String.double() = this.repeat(2)
class C1 {
    init {
        println("init".double())
    }
}

Пример внутреннего класса (файл C2.kt):

class C2 {
    private fun String.double() = this.repeat(2)
    init {
        println("init".double())
    }
}

Вопросы:

  1. Есть ли разница между этими двумя подходами, за исключением того, что в C1.kt функция расширения String.double() также будет видна другим возможным элементам файла (например, дополнительные классы в том же файле)?

  2. Поскольку мы хотим получить код "как можно более котлиническим", нам хотелось бы знать, какой из двух подходов является предложенным.Есть ли официальное предложение / руководство по стилю на приведенном выше примере?Я думаю, что считается хорошей практикой объявлять функции расширения как можно ближе к предполагаемому использованию, поэтому в приведенном выше примере будет предложена структура C2?

1 Ответ

0 голосов
/ 20 февраля 2019
  1. Есть ли разница в этих двух подходах, кроме того, что в C1.kt функция расширения String.double() также будет видна другим возможным элементам файла (таким как дополнительные классы в том же файле)?

Есть одно отличие: при указании функции расширения внутри класса (в вашем примере C2) у вас дополнительно есть доступ к экземпляру этого класса с помощью уточненный синтаксис this (в вашем примере this@C2).

Поскольку мы хотим создать код "как можно более котлиническим", нам хотелось бы знать, какой из двух подходов является предложенным.Есть ли официальное предложение / руководство по стилю на приведенном выше примере?Я думаю, что считается хорошей практикой объявлять функции расширения как можно ближе к предполагаемому использованию, поэтому в приведенном выше примере будет предложена структура C2?

Это хорошовопрос.Лично я бы поставил функции расширения вне класса, поскольку они (обычно) задают поведение, относящееся к типу extended , а не к типу класса, в котором они используются.Однако, если вам do нужна информация о классе внутри функции расширения, я бы затем указал ее внутри класса.

...