Übergeben des ganzen Objekts vs Passing Primitive Wert -

8

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%     
srivaradhan 09.03.2011, 06:07
quelle

4 Antworten

16

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.

    
T.J. Crowder 09.03.2011, 06:10
quelle
1
  • 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.

Jigar Joshi 09.03.2011 06:10
quelle
1

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.

    
Unmesh Kondolikar 09.03.2011 06:15
quelle
0

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.

    
DidierDotNet 09.03.2011 06:13
quelle

Tags und Links