[英]Why can I access a private fun outside a companion object in Kotlin?
在我看來,只能在類內部訪問私有函數,但是在我的示例中,可以訪問在伴隨對象之外的以下代碼bindPreferenceSummaryToValue(findPreference("RestoreItem"))
。 為什么?
碼
class UIPreference : AppCompatPreferenceActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_preference)
fragmentManager.beginTransaction().replace(R.id.content, MyPreferenceFragment()).commit()
setControl()
utility.setAD(adView)
}
class MyPreferenceFragment : PreferenceFragment() {
private lateinit var mContext: Context
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addPreferencesFromResource(R.xml.mypreference)
mContext=this.activity
setPreference()
bindPreferenceSummaryToValue(findPreference("RestoreItem"))
}
}
companion object {
private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener { preference, value ->
val stringValue = value.toString()
if (preference is ListPreference) {
val listPreference = preference
val index = listPreference.findIndexOfValue(stringValue)
preference.setSummary(
if (index >= 0)
listPreference.entries[index]
else
preference.summary)
}
true
}
private fun bindPreferenceSummaryToValue(preference: Preference) {
preference.onPreferenceChangeListener = sBindPreferenceSummaryToValueListener
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.context)
.getString(preference.key, ""))
}
}
}
致大衛·羅森(David Rawson)
謝謝! 但是從https://kotlinlang.org/docs/reference/visibility-modifiers.html看來, “私有意味着僅在此類內(包括其所有成員)可見”; 用於類和接口。
您能看一下圖片嗎?
要黃:
謝謝! 我無法通過以下代碼訪問MyB類中的私有成員,該類不屬於伴隨對象。
class UIPreference {
companion object {
private val aa=1
}
class MyA {
private val bar: Int =UIPreference.aa //OK
}
}
class MyB {
private val bar: Int = UIPreference.aa //Failed
}
在Kotlin中,伴隨對象可以有效替代Java的靜態成員,並且它們的可見性規則也可以以相同的方式工作。 就像在Java中,您可以從類的實例方法中調用私有靜態方法一樣,在Kotlin中,您可以從類的常規方法中調用伴隨對象的私有方法。
您的私人代碼仍在UIPreference class
,因此在該類中可見(僅!)。 但是,無法在您的UIPreference class
之外訪問該代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.