#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)
}
Тем не менее, я бы счел это довольно странным, потому что, похоже, использование объекта здесь не оправдано. Если это так (например, потому, что вы хотите опубликовать другие свойства из него публично), то, я думаю, вам следует поместить эту закрытую переменную вне объекта, как показано в первом варианте.