【问题标题】:Why can I access a private fun outside a companion object in Kotlin?为什么我可以在 Kotlin 中访问伴随对象之外的私人乐趣?
【发布时间】:2018-06-04 01:55:21
【问题描述】:

在我看来,私有函数只能在类内部访问,但在我的示例中,可以访问伴随对象外部的以下代码 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, ""))
        }
    }


}

致大卫·罗森

谢谢!但从https://kotlinlang.org/docs/reference/visibility-modifiers.html 看来,“private 意味着仅在此类内部可见(包括其所有成员);” 用于类和接口。

请看图片好吗?

致:

谢谢!我无法通过以下代码访问 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
}

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    在 Kotlin 中,伴生对象可以有效地替代 Java 的静态成员,并且它们的可见性规则以相同的方式工作。就像在 Java 中你可以从类的实例方法中调用私有静态方法一样,在 Kotlin 中你可以从类的常规方法中调用伴随对象的私有方法。

    【讨论】:

    • 谢谢!你能请我修改过的问题吗?但目前看不到大卫·罗森回答的内容
    • 你的意思是我可以访问伴随对象之外的私有成员吗?
    • 没有。伴随对象的私有成员在其包含的类中可见,但在其外部不可见。这再次与 Java 完全一样,它不允许从其他类调用一个类的私有静态方法。
    【解决方案2】:

    您的私人代码仍在您的UIPreference class 中,因此在此类中可见(仅!)。但是,您的UIPreference class外部无法访问该代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2021-07-08
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2019-12-31
      相关资源
      最近更新 更多