Это не является по своей сути ошибкой иметь публичные поля. Это не означает, что, как отмечается в примечании к награде, «ООП-фундаментальное нарушение». После того, как все эти два класса (в большинстве случаев) идентичны:
public class DemoA {
public int field;
}
public class DemoB {
private int field;
public int getField() { return field; }
public void setField(int value) { field = value; }
}
То есть, если вы намерены для абонентов, чтобы иметь прямое чтение и запись доступа к полю добавления геттер и сеттер может быть просто дополнительная котельная плита.
Преимущества геттеров и сеттеров, даже если они не выполняют никакой другой работы, кроме чтения и записи в поля, заключается в том, что они абстрагируют тот факт, что данные хранятся в поле вообще. Он может храниться во внешнем источнике данных или вычисляться «на лету» или независимо от того, что вам нужно, и вызывающим абонентам не нужно беспокоиться о том, как осуществляется поведение. Это, безусловно, хорошая практика вообще, потому что она отделяет проблемы вызывающих абонентов (API) от ваших проблем (реализации).
Однако иногда это просто излишний, и вполне разумно публиковать открытые поля, если это лучший способ обеспечить поведение, которое вам нужно. Чаще всего это делается для value types, классов, которые существуют only, чтобы сгруппировать несколько полей вместе. Там мало пользы для написания десятков геттеров и сеттеров, когда все, что вам нужно, чтобы сделать класс, можно сделать, просто сделав поля общедоступными.
Как практический вопрос, Android имеет дополнительную заботу. Вызов метода дорог и количество методов, которые приложение может (легко) определить, равно limited to ~65k. В тех случаях, когда это безопасно, разоблачение поля напрямую снижает накладные расходы метода на два и экономит ценное процессорное время. Это может показаться не очень много, но оно быстро складывается.
Почему вы спрашиваете нас? Спросите авторов. Они знают. – EJP
@EJP Они сказали, что сделали это намеренно в Android-трекер (они использовали public + '@ hide', а не частные) У меня нет личного контакта с разработчиками Android, и я думаю, что трекер для Android не для вопросов и ответов. –
Скорее всего, по соображениям производительности, то есть классы из других пакетов должны обращаться к ним по некоторому критическому пути. Действительно, 'android.widget.ListView' ссылается на него в' drawChild (Canvas canvas, View child, long drawingTime) '. Но без каких-либо комментариев от авторитетных фигур это просто гипотеза. – Kai