Kann ich einen primitiven Typ als Referenz in Java übergeben? [Duplikat]

7

Ich möchte eine Methode aufrufen, die möglicherweise verschiedene Versionen annehmen kann, d. h. die gleiche Methode für Eingabeparameter vom Typ:

  • boolean
  • Byte
  • kurz
  • int
  • lang

Das würde ich gerne tun, indem ich die Methode "überladen" würde (ich denke, das ist der richtige Ausdruck?):

%Vor%

... aber das würde bedeuten, dass ich den primitiven Typ durch Referenz übergeben müsste ... ähnlich wie in C ++, wo die Methode einen externen Effekt hat, wo sie die Variable außerhalb ihres Gültigkeitsbereichs ändern kann.

Gibt es eine Möglichkeit, dies zu tun, ohne neue Klassen zu erstellen oder die Objektversionen der primitiven Typen zu verwenden? Wenn nicht, irgendwelche Vorschläge zu alternativen Strategien?

Lassen Sie mich wissen, wenn ich weiter erklären sollte, um Verwirrung zu beseitigen.

AKTUALISIEREN

Was ich eigentlich versuche, ist, den primitiven Typ aus einer Menge von Bits zu konstruieren. Wenn ich also mit der Byte-Version der Methode beschäftigt bin, möchte ich so ziemlich meine Arbeit machen, um 8 Bits zu bekommen und das Byte zurückzugeben (da ich nicht durch Referenz passieren kann).

Der Grund, warum ich diese Frage stelle, ist, dass die Arbeit, die ich mit Bits mache, sehr repetitiv ist und ich nicht den gleichen Code in verschiedenen Methoden haben möchte. Ich möchte also einen Weg finden, wie meine EINE Methode wissen kann, wie viele Bits ich rede ... wenn ich mit einem Byte arbeite, dann 8 Bit, wenn ich mit kurzen, 16 Bit usw. Arbeite ...

    
Hristo 07.09.2010, 20:09
quelle

9 Antworten

8

Während Java das Überladen unterstützt, werden alle Parameter als Wert übergeben, d. h. das Zuweisen eines Methodenarguments ist für den Aufrufer nicht sichtbar.

In Ihrem Code-Snippet versuchen Sie, einen Wert verschiedener Typen zurückzugeben. Da Rückgabetypen nicht zur Signatur einer Methode gehören, können Sie nicht mit unterschiedlichen Rückgabetypen überladen. Daher ist der übliche Ansatz:

%Vor%

Wenn dies tatsächlich eine Konvertierung ist, lautet die Standardbenennung

%Vor%     
meriton 07.09.2010, 20:17
quelle
8

Java ist immer pass-by-value . In Java gibt es kein Pass-by-Reference. Es steht in den Spezifikationen !

    
Pablo Santa Cruz 07.09.2010 20:12
quelle
5

Sie können nicht. In Java werden Parameter immer nach Wert übergeben. Wenn der Parameter ein Referenztyp ist, wird der Verweis als Wert übergeben und Sie können ihn innerhalb der Methode ändern, während dies bei primitiven Typen nicht möglich ist.

Sie müssen einen Wrappertyp erstellen.

    
Darin Dimitrov 07.09.2010 20:10
quelle
1

Primitive werden nicht von Referenzen (oder Objekten) weitergegeben, also können Sie nicht.

%Vor%

Druckt 1 aus

    
willcodejavaforfood 07.09.2010 20:13
quelle
1

Die Objekttypen primitiver Typen in Java (Double, Integer, Boolean usw.) sind, wenn ich mich richtig erinnere, unveränderlich. Dies bedeutet, dass Sie den ursprünglichen Wert in einer Methode, an die sie übergeben werden, nicht ändern können.

Dafür gibt es zwei Lösungen. Eine besteht darin, einen Wrappertyp zu erstellen, der den Wert enthält. Wenn Sie lediglich versuchen, den Wert zu ändern oder eine Berechnung aus dem Wert zu erhalten, können Sie die Methode das Ergebnis für Sie zurückgeben lassen. Um Ihre Beispiele zu nehmen:

%Vor%

Und Sie würden sie wie folgt nennen:

%Vor%

oder etwas Ähnliches. Auf diese Weise können Sie den Wert ändern oder ändern und den mutierten Wert zurückgeben, der etwa Folgendes zulässt:

%Vor%

Ich hoffe, das hilft.

    
aperkins 07.09.2010 20:13
quelle
1

Ich würde sagen, dass die alternative Strategie, wenn Sie mit Primitiven arbeiten wollen, das ist, was die Java-Bibliotheken tun. Einfach saugen und mehrere Methoden haben.

Zum Beispiel hat ObjectInputStream readDouble() , readByte() , etc.

Sie gewinnen nichts, wenn Sie eine Implementierung der Funktion teilen, und die Clients Ihrer Funktion erhalten nichts, wenn die Varianten Ihrer Funktion alle den gleichen Namen haben.

AKTUALISIEREN

In Anbetracht Ihres Updates ist es nicht notwendig, zu viel Code zu duplizieren. Es hängt von Ihrer Verschlüsselungsstrategie ab, aber ich könnte mir vorstellen, dass Sie so etwas tun könnten:

%Vor%

Alles, was mehr Code teilt, ist wahrscheinlich übertrieben.

Eine Alternative könnte

sein %Vor%

d. Ich denke nicht, dass es sinnvoll ist, die Benutzer Ihrer Bibliothek etwas anderem als den primitiven Typen selbst zu zeigen.

Wenn Sie wirklich, wirklich wollten, dann könnten Sie eine einzige Methode für den Zugriff wie folgt machen:

%Vor%

Aber ich sehe nicht, wie es für die Kunden Ihrer Bibliothek weniger umständlich ist.

    
Mark Peters 07.09.2010 20:19
quelle
1

Klingt so, als hätten Sie eine Menge von Bits, die Sie analysieren. Sie sollten es in ein Objekt eingeschlossen haben, wir können dieses Objekt als BitSet bezeichnen. Sie durchlaufen die Bits, also haben Sie etwas wie einen Iterator & lt; Bit & gt ;, und während Sie gehen, möchten Sie Bytes, Inte, Longs usw. auslesen. Richtig?

Dann haben Sie Ihren Klassen-Parser und Methoden wie:

%Vor%

usw. ...

Nachdem Sie also die Methode aufgerufen haben, die Sie benötigen, haben Sie den gewünschten Wert typsicher extrahiert (unterschiedliche Rückgabetypen für verschiedene Methoden), und der Iterator wurde basierend auf dem Typ die richtige Anzahl von Positionen nach vorne verschoben .

Suchen Sie das?

    
romacafe 07.09.2010 20:41
quelle
0

Nur durch Erstellen eigener Werthaltearten.

    
Darron 07.09.2010 20:11
quelle
0

Ja, bitte seien Sie genauer, was Sie erreichen möchten. Aus Ihrer Beschreibung schlage ich vor, dass Sie sich Java-Generics anschauen, in denen Sie etwas schreiben könnten:

%Vor%     
einarmagnus 07.09.2010 20:21
quelle