Почему какой-то код Android имеет общедоступные поля?

Существует много вопросов и ответов об использовании публичных полей в объектно-ориентированном программировании, и большинство из них рекомендует не использовать публичные поля по многим причинам.

Но когда я просмотрел код Android, я обнаружил, что некоторые классы используют публичные поля. Например, Android.view.View имеет общедоступные поля mCachingFailed и mAttributes .

Почему они публичные? Трудно думать, что это ошибка в Google и AOSP.

Solutions Collecting From Web of "Почему какой-то код Android имеет общедоступные поля?"

Ошибочно иметь публичные поля. Это не означает, что, как отмечается в примечании к награде, «ООП-фундаментальное нарушение». В конце концов, эти два класса (для большинства целей) идентичны:

 public class DemoA { public int field; } public class DemoB { private int field; public int getField() { return field; } public void setField(int value) { field = value; } } 

То есть, если вы намерены, чтобы вызывающие лица имели прямой доступ к чтению и записи в поле, добавление геттера и сеттера может быть просто дополнительной котельной.

Преимущество getters и seters, даже если они не выполняют никакой другой работы, кроме чтения и записи в поля, заключается в том, что они абстрагируют тот факт, что данные хранятся в поле вообще. Он может храниться во внешнем источнике данных или вычисляться «на лету» или что угодно, и вызывающим абонентам не нужно беспокоиться о том, как это поведение реализовано. Это, безусловно, хорошая практика в целом, потому что она отделяет проблемы вызывающих абонентов (API) от ваших проблем (реализации).

Однако иногда это просто избыточно, и вполне разумно раскрывать публичные поля, если это лучший способ обеспечить поведение, которое вам нужно. Чаще всего это делается для типов значений , классов, которые существуют исключительно для группировки нескольких полей вместе. Там мало пользы для написания десятков геттеров и сеттеров, когда все, что вам нужно, чтобы сделать класс, можно сделать, просто сделав поля общедоступными.

В практическом плане Android вызывает дополнительную озабоченность. Вызов метода дорог и количество методов, которые приложение может (легко) определить, ограничено ~ 65k . В тех случаях, когда это безопасно, выставляя поле, он напрямую снижает накладные расходы метода на два и экономит ценное время CPU. Это может показаться не очень большим, но оно быстро складывается.

Посмотрите этот раздел с сайта developer.android.com:

На родных языках, таких как C ++, обычно использовать getters (i = getCount ()) вместо прямого доступа к полю (i = mCount). Это отличная привычка для C ++ и часто практикуется на других объектно-ориентированных языках, таких как C # и Java, потому что компилятор обычно может устанавливать доступ, а если вам нужно ограничить или отлаживать доступ к полю, вы можете добавить код в любое время.

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

Без JIT прямой доступ к полям примерно в 3 раза быстрее, чем при запуске тривиального getter. С JIT (где прямой доступ к полю дешевле, чем доступ к локальному), прямой доступ к полям примерно в 7 раз быстрее, чем при запуске тривиального getter.

Обратите внимание, что если вы используете ProGuard, вы можете получить лучшее из обоих миров, потому что ProGuard может использовать для вас дополнительные аксессоры

http://developer.android.com/training/articles/perf-tips.html#GettersSetters

Скорее всего, именно по этой причине вы видите публичные поля в AOSP.