Почему я могу получить доступ к частным развлечениям за пределами объекта-компаньона в Котлине? - PullRequest
0 голосов
/ 04 июня 2018

На мой взгляд, закрытая функция доступна только внутри класса, но в моем примере доступен следующий код 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 означает видимый только внутри этого класса (включая все его члены);" для классов и интерфейсов.

Не могли бы вы увидеть изображение?

enter image description here

To yole:

Спасибо!Я не могу получить доступ к закрытому члену класса 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 голосов
/ 04 июня 2018

Ваш личный код все еще находится в пределах вашего UIPreference class и поэтому виден в этом классе (только!).К этому коду, однако, нельзя получить доступ за пределами вашего UIPreference class.

0 голосов
/ 04 июня 2018

В Kotlin сопутствующие объекты эффективно работают вместо статических членов Java, и правила видимости для них работают аналогичным образом.Как и в Java, вы можете вызывать закрытый статический метод из метода экземпляра класса, в Kotlin вы можете вызывать закрытый метод объекта-компаньона из обычного метода класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...