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.

9voto

noah Punkte 20711

Groovy verfügt über Operator-Überladung und läuft in der JVM. Wenn Ihnen der Leistungsabfall nichts ausmacht (der täglich geringer wird). Die Überladung erfolgt automatisch auf der Grundlage von Methodennamen, z. B. ruft "+" die Methode "plus(argument)" auf.

4 Stimmen

Ich wünschte, alle syntaxlastigen Sprachen mit Operatorüberladung hätten diese Technik verwendet. Ich habe nie verstanden, warum sie eine spezielle Version der Methodenbenennung und -suche erfinden müssen. Stroustrup erwähnt keine Alternativen in D&EC++. Das C#-Team hat mit der Linq-Syntax den richtigen Ansatz gewählt ( where ... wird .Where(i => ... ). Hätte man nur dasselbe mit den arithmetischen Operatoren gemacht, dann wären viele Dinge einfacher und leistungsfähiger. Java hat den Vorteil eines Neuanfangs und könnte dies richtig machen (obwohl es das aus religiösen Gründen wahrscheinlich nie tun wird).

0 Stimmen

@DanielEarwicker, ich habe oft festgestellt, dass bei komplizierten Meinungsverschiedenheiten die Beweggründe der einen oder anderen Seite als "religiös" eingestuft werden.

0 Stimmen

@noah, ich könnte mit einer begrenzten Teilmenge von Operatorüberladungen wie dieser leben, vorausgesetzt, dass die Methodennamen mit einem speziellen Tag versehen sind, der sie visuell unterscheidbar macht. So etwas wie die Definition einer __plus()-Methode für die Implementierung eines "+"-OLs und das Fernbleiben von Überladungen wie Casts und sogar Array-Subscripts. Womit ich nicht leben kann, ist die Art und Weise, wie C++ und C# es umgesetzt haben.

8voto

Volksman Punkte 1901

Manche Leute sagen, dass die Überladung von Operatoren in Java zu einer Verschleierung führen würde. Haben diese Leute jemals innegehalten und sich einen Java-Code angesehen, in dem grundlegende mathematische Aufgaben wie die Erhöhung eines Geldwertes um einen Prozentsatz mit BigDecimal ausgeführt werden? .... wird die Ausführlichkeit einer solchen Übung zu einer eigenen Demonstration der Verschleierung. Ironischerweise würde das Hinzufügen von Operatorüberladung zu Java es uns ermöglichen, unsere eigene Währungsklasse zu erstellen, die solchen mathematischen Code elegant und einfach (weniger verschleiert) machen würde.

5voto

user14128 Punkte 2469

Ich denke, dass dies eine bewusste Entscheidung war, um die Entwickler zu zwingen, Funktionen zu erstellen, deren Namen ihre Absichten deutlich machen. In C++ überfrachteten die Entwickler die Operatoren mit Funktionen, die oft nichts mit der allgemein akzeptierten Natur des jeweiligen Operators zu tun hatten, so dass es fast unmöglich war, festzustellen, was ein Stück Code tut, ohne sich die Definition des Operators anzusehen.

15 Stimmen

In C++ developers would overload operators with functionality that would often have no relation to the commonly accepted nature of the given operator : Dies ist eine unberechtigte Behauptung. Ich bin seit 12 Jahren professioneller C++-Entwickler, und ich bin selten auf dieses Problem gestoßen. Die meisten Bugs und Designfehler, die ich in C++ gesehen habe, waren in C-artigem Code ( void * , Gipsabdrücke, etc.)

7 Stimmen

-1. Jede Variable, die Sie zuweisen, ist ein Symbol, genau wie die Symbole der arithmetischen Operatoren. Ob Sie eine Phrase, ein einzelnes Wort oder einen einzelnen Buchstaben verwenden, um die Variable zu benennen, ist Ihre Entscheidung (oder die Ihres Teams). Wer kann sagen, was sinnvoll ist und was nicht? Die Antwort lautet: Sie, der Programmierer. In der reinen Mathematik bedeutet die Multiplikation zwischen Matrizen etwas anderes als die Multiplikation zwischen zwei Zahlen in der Grundrechenart. Dennoch verwenden wir für beide Arten der Multiplikation die gleichen Symbole.

2 Stimmen

@paercebal: Die Behauptung ist leider richtig. Man muss nicht weiter als IOstreams schauen, um es in Aktion zu sehen. Zum Glück sind die meisten Entwickler umsichtiger, wenn es darum geht, neue Semantiken für bestehende Operatoren zu erfinden.

5voto

Olai Punkte 1

Technisch gesehen gibt es in jeder Programmiersprache, die mit verschiedenen Zahlentypen umgehen kann, z. B. Integer und reelle Zahlen, Operatorüberladung. Zur Erläuterung: Der Begriff Überladen bedeutet, dass es einfach mehrere Implementierungen für eine Funktion gibt. In den meisten Programmiersprachen gibt es verschiedene Implementierungen für den Operator +, eine für ganze Zahlen, eine für reelle Zahlen, das nennt man Operatorüberladung.

Viele Leute finden es seltsam, dass Java eine Operatorüberladung für den Operator + zum Addieren von Zeichenketten hat, und vom mathematischen Standpunkt aus wäre dies in der Tat seltsam, aber vom Standpunkt des Entwicklers einer Programmiersprache aus gesehen, ist nichts falsch daran, eine eingebaute Operatorüberladung für den Operator + für andere Klassen, z. B. String, hinzuzufügen. Die meisten Leute sind sich jedoch einig, dass es im Allgemeinen eine gute Idee ist, diese Funktionalität auch dem Entwickler zur Verfügung zu stellen, sobald man eine Überladung für + für String einbaut.

Dem Trugschluss, dass die Überladung von Operatoren den Code verschleiert, kann ich nicht zustimmen, da dies der Entscheidung des Entwicklers überlassen ist. Das ist naiv zu denken, und um ehrlich zu sein, wird es langsam alt.

+1 für das Hinzufügen von Operatorüberladungen in Java 8.

1 Stimmen

Javas Verwendung von + zum Verketten von Zeichenketten ist IMHO ziemlich hässlich, ebenso wie das Überladen von / in C und FORTRAN für ganze und gebrochene Divisionen. In vielen Versionen von Pascal führt die Verwendung von arithmetischen Operatoren auf einem beliebigen numerischen Typ zu Ergebnissen, die numerisch äquivalent zur Umwandlung der Operanden in Real wobei die Ergebnisse, die möglicherweise nicht ganzzahlig sind, durch Trunc o Round bevor sie ganzen Zahlen zugewiesen werden können.

4voto

Die Behauptung, dass die Überladung von Operatoren zu logischen Fehlern des Typs führt, der nicht mit der Logik der Operation übereinstimmt, ist so, als würde man nichts sagen. Die gleiche Art von Fehlern tritt auf, wenn der Funktionsname nicht zur Operationslogik passt - was ist also die Lösung: die Fähigkeit der Funktionsverwendung abschaffen!? Das ist eine komische Antwort - "Unpassend für die Operationslogik", jeder Parametername, jede Klasse, Funktion oder was auch immer kann logisch unpassend sein. Ich denke, dass diese Option in respektablen Programmiersprachen verfügbar sein sollte, und diejenigen, die denken, dass es unsicher ist - hey, niemand sagt, dass man es benutzen muss. Nehmen wir C#. Sie haben die Zeiger abgeschafft, aber hey - es gibt die Anweisung 'unsicherer Code' - programmieren Sie, wie Sie wollen, auf eigenes Risiko.

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