Immer wenn ich eine neue Klasse schreibe, benutze ich ziemlich viele Klassenvariablen, um die Eigenschaften der Klasse zu beschreiben, bis zu dem Punkt, an dem ich die Codes wiederhole, die ich geschrieben habe, 40 bis 50 Klassenvariablen Unabhängig davon, ob sie öffentlich, geschützt oder privat sind, werden sie alle in den von mir definierten Klassen verwendet.
Obwohl die Klassenvariablen aus meist primitiven Variablen bestehen, wie booleschen Werten, ganzen Zahlen, Doppeln usw., habe ich immer noch das unbehagliche Gefühl, dass einige meiner Klassen mit großen Mengen von Klassenvariablen sich auf die Performance auswirken könnten. wie unbedeutend sie auch sein mögen.
Aber wenn ich rational wie möglich denke, wenn ich eine unbegrenzte RAM-Größe und unbegrenzte Java-Klassenvariablen in Betracht ziehe, kann eine Java-Klasse ein unendlich großer Speicherblock im RAM sein, wobei der erste Teil des Blocks die Klassenvariablen Partitionen und enthält Der Rest des Blocks enthält die Adressen für die Klassenmethoden innerhalb der Java-Klasse. Mit dieser Menge an RAM ist die Leistung dafür sehr untrivial.
Aber das oben genannte macht meine Gefühle nicht leichter als gesagt. Wenn wir begrenzten RAM, aber unbegrenzte Java-Klassenvariablen betrachten würden, was wäre das Ergebnis? Was würde wirklich in einer Umgebung passieren, in der Leistung eine Rolle spielt?
Und wahrscheinlich kann es vorher erwähnt werden, ich weiß nicht, ob viele Klassenvariablen als schlechte Java-Praxis gelten, wenn alle wichtig sind und alle Klassen umstrukturiert wurden.
Vielen Dank im Voraus.
Die Leistung hat nichts mit der Anzahl der Felder eines Objekts zu tun. Speicherverbrauch ist natürlich potenziell betroffen, aber wenn die Variablen benötigt werden, können Sie nicht viel dagegen tun. Mach dir keine Sorgen über die Leistung. Machen Sie Ihren Code einfach, lesbar, wartbar, getestet. Wenn Sie dann Leistungsprobleme feststellen, messen und profilieren Sie, um zu sehen, woher sie kommen, und optimieren Sie wo nötig.
Wartbarkeit und Lesbarkeit hängen von der Anzahl der Felder ab, die ein Objekt hat. 40 bis 50 Felder sind ziemlich viele Felder, und ist wahrscheinlich ein Hinweis darauf, dass Ihre Klassen zu viel alleine tun und zu viele Verantwortlichkeiten haben. Es wäre wahrscheinlich eine gute Idee, sie in viele kleinere Unterklassen umzuwandeln und Komposition zu verwenden.
Ich hoffe, ich höre mich nicht wie ein Esel an, aber meiner Meinung nach sind mehr als zehn Eigenschaften in einer Klasse normalerweise ein Hinweis auf ein schlechtes Design und erfordern eine Begründung.
Wenn Sie sehr oft alle diese Eigenschaften benötigen, sparen Sie etwas Speicher, da jedes Objekt auch eine Kopfzeile hat. So, dass Sie 5-10 Klassen haben, fügen Sie alles in eins und Sie sparen einige Bytes.
Je nachdem, welchen Garbage Collector Sie verwenden, kann die Zuordnung größerer Objekte teurer sein (dies gilt für den CMS-Garbage Collector, nicht jedoch für den parallelen Garbage Collector). Mehr GC-Arbeit = weniger Zeit für die Ausführung Ihrer App.
Sofern Sie nicht eine Anwendung mit hohem Datenverkehr und geringer Latenz schreiben, werden die Vorteile weniger Klassen (und weniger Arbeitsspeicher) durch den zusätzlichen Aufwand für die Wartung komplett überlastet.
Das größte Problem, das ich bei einer Klasse mit vielen Variablen sehe, ist Thread-Sicherheit - in einem solchen Fall wird es sehr schwer sein, über die Invarianten nachzudenken. Auch das Lesen / Pflegen einer solchen Klasse wird sehr schwer werden.
Natürlich, wenn Sie so viel wie möglich Felder unwandelbar machen, wird das viel besser sein.
Ich versuche zu gehen: weniger ist besser, einfacher zu pflegen.
Ein Grundprinzip, das uns immer gelehrt wird, ist, die Kohärenz hoch zu halten (eine Klasse konzentriert sich auf eine Aufgabe) und die Kopplung niedrig (weniger gegenseitige Abhängigkeit zwischen Klassen, so dass Änderungen in einem keinen Effekt auf andere haben).
Während ich ein System entwerfe, werde ich glauben, dass der Fokus mehr auf dem wartbaren Design liegen sollte, die Leistung wird sich von selbst erledigen. Ich glaube nicht, dass es eine feste Grenze für die Anzahl der Variablen gibt, die eine Klasse als gute Praxis haben kann, da dies ausschließlich von Ihrer Anforderung abhängt.
Wenn ich zum Beispiel eine Anforderung habe, bei der die Anwendung einen Kurs für den Schüler vorschlägt und der Algorithmus 50 Eingaben benötigt (Punkte, Hobbys usw.), spielt es keine Rolle, ob diese Daten in einer oder mehreren Klassen verfügbar sind Informationen müssen für eine schnellere Ausführung in den RAM geladen werden.
Ich werde noch einmal sagen, kümmern Sie sich um Ihr Design, es ist sowohl schädlich, unnötige Variablen in einer Klasse zu halten (da es nicht benötigte Informationen in RAM laden wird) oder in mehr Klassen aufgeteilt als erforderlich (mehr Referenzen und damit Zeiger Bewegung)
1. Ich benutze das immer als Daumen der Regel. Eine Klasse sollte nur einen Grund zum Ändern haben, also sollte sie nur eine Sache machen.
2. Wenn ich das beachte, nehme ich die Variablen, die zum Definieren der Attribute dieser Klasse benötigt werden.
3. Ich stelle sicher, dass meine Klasse dem Cohesive principle
folgt, wobei die Methoden innerhalb der Klasse den Klassennamen widerspiegeln.
4. Nachdem ich nun alles sortiert habe, wenn ich noch andere Variablen brauche, um meine Klasse zu trainieren, dann muss ich sie verwenden, ich habe keine Wahl ... Außerdem nach all diesen Überlegungen und die Arbeit, die in die Schaffung einer Klasse geht, wird kaum durch einige zusätzliche Variablen beeinflußt werden.
Manchmal werden Klassenvariablen als statische Endkonstanten verwendet, um einige Standardzeichenfolgen wie Produktname, Version, Betriebssystemversion usw. zu speichern. Sie können auch produktspezifische Einstellungen wie Schriftgröße, Typ usw. speichern. Diese statischen Variablen können beibehalten werden Klassenstufe.
Sie können auch HashMap statt der einfachen Klasse verwenden, wenn Sie nur Feldkonstanten oder ähnliche Produkteinstellungen speichern möchten, die sich nur selten ändern. Das kann Ihnen helfen, die Antwortzeit zu verkürzen.
Zwei Dinge, die ich erwähnen möchte: 1. Alle Instanzvariablen werden im Heap-Bereich des RAM gespeichert. 2. Alle statischen Variablen werden im Nicht-Heap-Bereich (genauer im Methodenbereich) gespeichert.
Was auch immer der Typ der Variablen sein mag (Instanz oder statisch), sie befinden sich letztendlich alle im RAM.
Kommen Sie jetzt zu Ihrer Frage. Was die Instanzvariable betrifft, wird der eingebaute Garbage Collector von java in den meisten Fällen gut und effektiv funktionieren, um Speicher freizugeben. Statische Variablen werden jedoch nicht als Müll gesammelt.
Wenn Sie aufgrund einer großen Anzahl von Variablen in Ihrer Klasse stark an Speicherproblemen interessiert sind, können Sie anstelle der traditionellen starken Referenz schwache Referenzen verwenden.
Tags und Links java class performance variables