Es ist nicht von Natur aus ein Fehler, öffentliche Felder zu haben. Es ist nicht, wie die Kopfgeldnote andeutet, eine "OOP-Grundrechtsverletzung". Nach all diesen zwei Klassen (für die meisten Zwecke) identisch sind:
public class DemoA {
public int field;
}
public class DemoB {
private int field;
public int getField() { return field; }
public void setField(int value) { field = value; }
}
Das heißt, wenn Sie beabsichtigen für Anrufer direkt lesen zu haben und auf ein Feld Schreibzugriff sein, einen Getter und Setter-Zugabe kann nur extra Kesselplatte.
Der Vorteil von Getter und Setter, auch wenn sie nichts anderes tun, als Felder zu lesen und zu schreiben, besteht darin, dass sie die Tatsache abstrahieren, dass die Daten überhaupt in einem Feld gespeichert sind. Es könnte in einer externen Datenquelle gespeichert werden oder im laufenden Betrieb oder was auch immer Sie möchten, und Anrufer müssen sich nicht darum kümmern, wie das Verhalten implementiert wird. Dies ist definitiv eine gute Praxis im Allgemeinen weil es die Anrufer Anliegen (die API) von Ihren Bedenken (die Implementierung) trennt.
Aber manchmal ist es einfach zu viel, und es ist völlig in Ordnung, öffentliche Felder verfügbar zu machen, wenn das das beste Verhalten ist, das Ihre Anrufer benötigen. Meistens geschieht dies für value types, Klassen, die nur existieren, um eine Anzahl von Feldern zusammenzufassen. Es macht wenig Sinn, die Anzahl der Getter und Setter zu notieren, wenn alles, was Sie brauchen, erledigt werden kann, indem Sie einfach die Felder veröffentlichen.
Aus praktischen Gründen hat Android ein zusätzliches Problem. Methodenaufrufe sind teuer und die Anzahl der Methoden, die eine App (leicht) definieren kann, ist limited to ~65k. In Fällen, in denen dies gefahrlos möglich ist, reduziert das direkte Aussetzen eines Felds den Methodenaufwand um zwei und spart wertvolle CPU-Zeit. Das scheint nicht viel, aber es summiert sich schnell.
Warum fragen Sie uns? Fragen Sie die Autoren. Sie wissen. – EJP
@EJP Sie sagten, dass sie es absichtlich in Android Issue Tracker getan hatten (sie benutzten public + '@ hide' anstelle von privat) Ich habe keinen persönlichen Kontakt zu Android Entwicklern, und ich denke Android Problem Tracker ist nicht für Q & A. –
Höchstwahrscheinlich aus Leistungsgründen, d. H. Klassen aus anderen Paketen müssen auf einigen kritischen Pfaden auf sie zugreifen. In der Tat verweist 'android.widget.ListView' auf' drawChild (Canvas Canvas, View Kind, long drawingTime) '. Aber ohne Kommentar von maßgeblichen Persönlichkeiten ist dies nur eine Vermutung. – Kai