Функция доступа к закрытому члену класса в том же файле

#kotlin #visibility #private

Вопрос:

У меня есть функция, которая полагается на свойство, инициализируемое во время загрузки класса. В настоящее время это написано так:

 object MyObj {
    private val myPrivateProperty = someInitializingStuff();

    fun foo(bar: String) {
        doSomethingWith(bar, myPrivateProperty)
    }
}
 

Однако я бы предпочел, чтобы его можно было вызвать с использованием более простого синтаксиса foo(bar) вместо MyObj.foo(bar) . Поэтому я подумал, что мог бы убрать это из объявления объекта, вот так:

 object MyObj {
    private val myPrivateProperty = someInitializingStuff();
}

fun foo(bar: String) {
    doSomethingWith(bar, MyObj.myPrivateProperty)
}
 

Я надеялся, что foo к нему все еще будет доступ myPrivateProperty , потому что он находится в том же исходном файле, но, к сожалению, он недоступен. Я не хочу этого делать, internal потому что тогда мои коллеги смогли бы получить доступ к нему из своих собственных классов, но я хочу, чтобы это было доступно только для функций, объявленных только в этом исходном файле.

Если бы я писал это на C , я бы определил myPrivateProperty как статическую локальную переменную внутри тела функции, но в Kotlin это невозможно.

Есть ли другой способ, которым я могу это сделать?

Ответ №1:

По сути, вы не хотите, чтобы это свойство было закрытым для объекта, потому что вы хотите использовать его в другой функции. Поэтому вы должны объявить его private , но вместо этого на уровне файла (верхний уровень). Вам не нужно хранить эту переменную в объекте, если вам это не нужно:

 private val myPrivateProperty = someInitializingStuff();

fun foo(bar: String) {
    doSomethingWith(bar, myPrivateProperty)
}
 

Другой вариант-сделать сам объект закрытым для файла, но свойство в объекте может быть общедоступным:

 private object MyObj {
    val myPrivateProperty = someInitializingStuff();
}

fun foo(bar: String) {
    doSomethingWith(bar, MyObj.myPrivateProperty)
}
 

Тем не менее, я бы счел это довольно странным, потому что, похоже, использование объекта здесь не оправдано. Если это так (например, потому, что вы хотите опубликовать другие свойства из него публично), то, я думаю, вам следует поместить эту закрытую переменную вне объекта, как показано в первом варианте.