簡體   English   中英

為什么我可以在Kotlin的同伴對象之外訪問私人娛樂活動?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM