为什么我可以在Kotlin的同伴对象外访问私人乐趣?

时间:2018-06-04 01:55:22

标签: android 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开始,似乎"私有意味着只在这个类中可见(包括其所有成员);" 用于类和接口。

你能看到图片吗?

enter image description here

致:

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您的私人密码仍在= ?)"范围内,因此在此课程中可见(仅限!)。但是,该代码无法在外部 /** * Display the specified resource. * * @param \App\Event $event * @return \Illuminate\Http\Response */ public function show($id) { // The current event $event = Event::find($id); // Find related, upcoming events $tags = $event->tags; $relatedEvents = Event::where('startDate', '>=', Carbon::now()) ->where(function ($query) use ($event) { $query->where('hostedBy', $event->hostedBy); $query->orWhere('type', $event->hostedBy); $query->orWhere('category', $event->hostedBy); $query->orWhere('sector', $event->hostedBy); $query->orWhereHas('tags', function ($query) use ($tags) { $query->where('slug', $tags->slug); }); }) ->toSql(); dd($relatedEvents); }

中访问