489 Stimmen

Warum bietet Java keine Operatorüberladung?

Wenn man von C++ zu Java wechselt, ist die offensichtliche unbeantwortete Frage, warum Java keine Operatorüberladung enthält.

Ist nicht Complex a, b, c; a = b + c; viel einfacher als Complex a, b, c; a = b.add(c); ?

Gibt es dafür einen bekannten Grund, stichhaltige Argumente für no das Überladen von Operatoren zuzulassen? Ist der Grund willkürlich oder aus Zeitmangel?

6 Stimmen

1 Stimmen

@zzzz, es fällt mir schwer, diesen Artikel zu lesen. Wurde er automatisch übersetzt, oder ist Englisch die zweite Sprache des Autors? Ich finde die Diskussion hier viel sauberer.

48 Stimmen

An die Leute, die dies als nicht konstruktiv abtun: Diese Frage hat einen der konstruktivsten Dialoge hervorgebracht, die ich bei SO gesehen habe. Vielleicht ist es ein besserer Kandidat für programmers.stackexchange.com aber es gibt Zeiten, in denen ich denke, dass SO übermäßig abweisend gegenüber breiteren Themen ist.

4voto

Sarien Punkte 6302

Mit einer Überlastung des Bedieners kann man sich wirklich in den Fuß schießen. Es ist wie mit den Zeigern, die Leute machen dumme Fehler mit ihnen, und so wurde beschlossen, die Schere wegzunehmen.

Zumindest glaube ich, dass dies der Grund dafür ist. Ich bin jedenfalls auf deiner Seite :)

0 Stimmen

Wie zum Beispiel diesen dummen Fehler...

4 Stimmen

Das ist eine sehr schlechte Art zu denken. Sie können sich selbst in den Fuß schießen, wir schneiden Ihnen lieber die Hände ab, damit Sie das nicht können. Und natürlich gehen wir davon aus, dass Sie ein Idiot sind, der sich selbst erschießen wird.

3voto

David Schlosnagle Punkte 4243

Unter der Annahme, dass Java die Implementierungssprache ist, wären a, b und c alle Verweise auf den Typ Complex mit dem Anfangswert null. Auch unter der Annahme, dass Complex unveränderlich ist, wie die erwähnte BigInteger und ähnliche unveränderliche BigDecimal Ich denke, Sie meinen das Folgende, da Sie den Verweis auf den Complex zuweisen, der durch die Addition von b und c zurückgegeben wird, und diesen Verweis nicht mit a vergleichen.

Ist es nicht:

Complex a, b, c; a = b + c;

beaucoup Einfacher als:

Complex a, b, c; a = b.add(c);

2 Stimmen

Bin ich das? ;) Equals kann sowohl Zuweisung als auch Vergleich bedeuten, aber = ist immer Zuweisung und == ist immer Vergleich. Namen können selbst große Fehlerquellen darstellen.

2voto

gagarwa Punkte 1168

Alternativen zur nativen Unterstützung der Java-Operatorüberladung

Da Java keine Operatorüberladung kennt, gibt es einige Alternativen, die Sie in Betracht ziehen können:

  1. Verwenden Sie eine andere Sprache. Beide Groovy y Scala haben Operatorüberladung und basieren auf Java.
  2. Verwenden Sie java-oo , ein Plugin, das die Überladung von Operatoren in Java ermöglicht. Beachten Sie, dass es NICHT plattformunabhängig ist. Außerdem hat es viele Probleme und ist nicht mit den neuesten Versionen von Java (z.B. Java 10) kompatibel. ( Original StackOverflow-Quelle )
  3. Verwenden Sie JNI , Java Native Interface, oder Alternativen. Dies ermöglicht es Ihnen, C- oder C++-Methoden (vielleicht auch andere?) für die Verwendung in Java zu schreiben. Natürlich ist auch dies NICHT plattformunabhängig.

Wenn jemand andere kennt, bitte ich um einen Kommentar, damit ich sie in diese Liste aufnehmen kann.

1 Stimmen

Kotlin unterstützt auch die Überladung von Operatoren.

1voto

Manchmal wäre es schön, Operatorüberladung, Freundesklassen und Mehrfachvererbung zu haben.

Ich denke aber trotzdem, dass es eine gute Entscheidung war. Hätte Java eine Überladung der Operatoren, könnten wir nie sicher sein, welche Bedeutung die Operatoren haben, ohne den Quellcode zu lesen. Zurzeit ist das nicht nötig. Und ich denke, dass Ihr Beispiel der Verwendung von Methoden anstelle von Operatorüberladung auch recht gut lesbar ist. Wenn Sie die Dinge noch klarer machen wollen, können Sie jederzeit einen Kommentar über haarige Anweisungen hinzufügen.

// a = b + c
Complex a, b, c; a = b.add(c);

12 Stimmen

Wie bereits an anderer Stelle erwähnt, kann man sich der Bedeutung der Additionsfunktion natürlich auch nicht sicher sein.

0 Stimmen

Allerdings finde ich es beruhigend zu wissen, dass zumindest meine Operatoren fest kodiert sind. Natürlich würde es uns nur gut tun, die Funktionen zu haben und sie sinnvoll zu nutzen. Das Problem ist, dass es schwer ist, zu wissen, ob jemand sie sinnvoll verwendet hat. Und dass Sie mit der Definition von "sinnvoll" einverstanden sind :-)

1 Stimmen

Der Kommentar, der zur Verdeutlichung des Codes hinzugefügt wurde, zeigt, wie der Code in einer Sprache aussehen würde, die das Überladen von Operatoren unterstützt. Die Tatsache, dass der Kommentar in Form von Operatoren geschrieben ist, beweist, dass Sie gegen das Überladen von Operatoren sind.

1voto

Sarien Punkte 6302

Dies ist kein guter Grund, sie zu verbieten, sondern ein praktischer Grund:

Die Menschen gehen nicht immer verantwortungsbewusst mit ihr um. Sehen Sie sich dieses Beispiel aus der Python-Bibliothek scapy an:

>>> IP()
<IP |>
>>> IP()/TCP()
<IP frag=0 proto=TCP |<TCP |>>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=TCP |<TCP |>>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
<IP frag=0 proto=TCP |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>
>>> Ether()/IP()/IP()/UDP()
<Ether type=0x800 |<IP frag=0 proto=IP |<IP frag=0 proto=UDP |<UDP |>>>>
>>> IP(proto=55)/TCP()
<IP frag=0 proto=55 |<TCP |>>

Hier ist die Erklärung:

Der Operator / wurde als Kompositionsoperator zwischen zwei Ebenen verwendet. Dabei kann die untere Ebene eine oder mehrere ihrer Standardfelder entsprechend der oberen Schicht überladen werden. (Sie können immer noch können Sie den gewünschten Wert angeben). Eine Zeichenkette kann als rohe Ebene verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X