Gibt es ein Overhead- oder Leistungsproblem beim Übergeben des gesamten Objekts im Vergleich zum Übergeben? primitiver Wert wie in Option 1 und 2?.
[BEARBEITEN: Ich wollte sagen, dass ich eine Referenz eines Java-Objekts gegen einen primitiven Typ übergeben habe. Von @ T.J. Crowder, ich verstehe, dass es hier kein Leistungsproblem gibt, da die Objektreferenzgröße in beiden Fällen gleich ist. Aber Intermediate von API-Design-Stil / Perspektive, die Option ist die beste? ]
Ich definiere derzeit die Service-Ebene. Ich bevorzuge "Typ 1", wie ich es mag, aber wenn "Typ 2" gut für die Leistung ist, werde ich mit Typ 2 gehen.
%Vor% Sie übergeben niemals ein "ganzes Objekt" in Java. Was übergeben wird, ist eine Referenz, die ungefähr die Größe eines int
oder so ist. Was Sie übergeben - eine Objektreferenz oder eine int
ID - hat keinen Einfluss auf die Leistung in Bezug auf den Aufruf der Funktion selbst.
Wenn Sie jedoch die Objektreferenz übergeben, können Sie direkt auf das Objekt zugreifen, während das Übergeben der ID bedeutet, dass Sie, wenn Sie auf das Objekt zugreifen müssen, erneut nach ID suchen müssen, was sich negativ auf die Leistung auswirken könnte.
Bearbeiten : Basierend auf Ihrem Update:
Ich verstehe, dass es hier kein Leistungsproblem gibt, da die Objektreferenzgröße in beiden Fällen gleich ist. Aber zwischen API-Design-Stil / Perspektive, welche Option ist die beste?
Das ändert die Frage völlig (und scheint den "Performance" -Teil vollständig fallen zu lassen).
Es hängt vollständig von A) ab, was Sie in doSomeOperation
tun werden, und B) Welche Informationen die Aufrufer von doSomeOperation
am wahrscheinlichsten haben.
Wenn doSomeOperation
mehr als nur die Benutzer-ID benötigt, dann gebe das Objekt natürlich weiter.
Wenn doSomeOperation
nichts anderes als die Benutzer-ID benötigt, dann möchten Sie wahrscheinlich nur die ID übergeben. Es gibt Kompromisse. Wenn Sie nur eine int
ID übergeben, verliert doSomeOperation
einerseits seine Kopplung an User
(was normalerweise gut ist); Auf der anderen Seite wird das Argument von doSomeOperation
weitgehend bedeutungslos. (Ein int
könnte alles sein, aber User
hat eine Bedeutung.)
Wenn doSomeOperation
ein Argument User
benötigt, aber wirklich nur die Benutzer-ID benötigt, belasten Sie die Aufrufer von doSomeOperation
: Wenn sie nur die ID haben, müssen sie nur das Objekt nachschlagen um es in doSomeOperation
zu übergeben (was dann alles außer der ID ignoriert). Das ist aus Performance-Sicht eindeutig schlecht.
Also ich denke, die Zusammenfassung ist: Wenn doSomeOperation
etwas von User
nur über seine ID benötigt, übergeben Sie in User
. Wenn es nur die ID benötigt und nichts anderes von User
benötigt, geben Sie einfach die ID ein.
Wenn Sie sicher sind, dass Sie nicht andere Informationen als nur die Benutzer-ID benötigen, gehen Sie zu type 2
andernfalls 1.
mehr über Sie übergeben nicht das ganze Objekt, nur die Bits der Referenz werden kopiert.
Angenommen, Sie möchten einige Informationen in doSomeOperation
des Benutzers aktualisieren, dann müssen Sie dieses Objekt mit einer ID abrufen, die kostspielig sein wird.
Aus der Sicht der Leistung gibt es keinen signifikanten Unterschied zwischen type1
und type2
. Aus der Sicht des Designs gibt es.
Als eine allgemeine Regel, nur übergeben, was ist benötigt, nicht mehr und nicht weniger.
Wenn Sie einen Verweis auf das Objekt User
übergeben, wird Ihre doSomeOperation
an User
klasse gekoppelt. Dies kann in Zukunft zu Problemen führen, wie z. B. Schwierigkeiten beim Testen der Methode usw.
Wenn Sie bereits die Instanz des Benutzerobjekts übergeben haben. Wenn Sie das Objekt übergeben, übergeben Sie nur eine Referenz und nicht eine Menge Speicher. Wenn Sie die ID übergeben, müssen Sie den Benutzer wahrscheinlich aus der Datenbank abrufen. Das ist Overhead.