Frage

Von C ++ zu Java, ist die offensichtliche ungeklärte Frage, warum nicht Java Überladen von Operatoren enthalten?

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

Sie haben einen bekannten Grund dafür, gültige Argumente für nicht Überladen von Operatoren ermöglicht? Ist der Grund, willkürlich oder verloren zu Zeit?

War es hilfreich?

Lösung

Angenommen, Sie den vorherigen Wert des Objekts, auf den a, dann einer Elementfunktion müßte aufgerufen werden.

zu überschreiben wollten
Complex a, b, c;
// ...
a = b.add(c);

In C ++, sagt dieser Ausdruck die Compiler drei (3) Objekte auf dem Stapel zu erstellen, führt hinaus und Kopie der resultierende Wert aus dem temporären Objekt in die bestehenden Objekt a.

Doch in Java, ist operator= nicht Wert Kopie für Referenztypen ausführen, und Benutzer können lediglich neue Referenztypen erstellen, nicht Werttypen. Also für einen benutzerdefinierten Typ namens Complex, Zuweisungsmittel einen Verweis auf einen vorhandenen Wert zu kopieren.

Sie stattdessen:

b.set(1, 0); // initialize to real number '1'
a = b; 
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail

In C ++ diese kopiert den Wert, so wird das Vergleichsergebnis nicht-gleich. In Java, führt operator= Referenzkopie, so a und b beziehen sich nun auf den gleichen Wert. Als Ergebnis erzeugt der Vergleich ‚gleich‘, da wird das Objekt an sich selbst gleich vergleichen.

Der Unterschied zwischen Kopien und Verweise nur noch auf die Verwirrung der Betreiber Überlastung. Wie @Sebastian erwähnt, Java und C # sind separat mit Wert und Referenz Gleichheit behandeln - operator+ wahrscheinlich mit Werten und Objekten tun würde, aber operator= sind bereits mit Referenzen beschäftigen umgesetzt

.

In C ++, sollten Sie nur mit einer Art von Vergleich zu einem Zeitpunkt zu tun, so kann es weniger verwirrend sein. Zum Beispiel auf Complex, operator= und operator== arbeiten beide auf Werte - das Kopieren von Werten und Werte zu vergleichen bzw.

.

Andere Tipps

Es gibt viele Beiträge über Betreiber Überlastung beschweren.

Ich hatte das Gefühl, die „Betreiber Überlastung“ zu klären Konzepte, die eine alternative Sicht auf diesem Konzept bieten.

Code-Verschleierung?

Dieses Argument ist ein Irrtum.

Verschleierung ist möglich, in allen Sprachen ...

Es ist so einfach, Code in C oder Java durch Funktionen / Methoden zu verschleiern, wie es in C ++ durch Betreiber Überlastungen ist:

// C++
T operator + (const T & a, const T & b) // add ?
{
   T c ;
   c.value = a.value - b.value ; // subtract !!!
   return c ;
}

// Java
static T add (T a, T b) // add ?
{
   T c = new T() ;
   c.value = a.value - b.value ; // subtract !!!
   return c ;
}

/* C */
T add (T a, T b) /* add ? */
{
   T c ;
   c.value = a.value - b.value ; /* subtract !!! */
   return c ;
}

... Selbst in Java Standard-Schnittstellen

Für ein weiteres Beispiel wollen wir sehen, die Cloneable Schnittstelle in Java:

Sie sollen das Objekt der Umsetzung dieser Schnittstelle klonen. Aber man könnte liegen. Und erstellen Sie ein anderes Objekt. In der Tat ist diese Schnittstelle so schwach, Sie ganz andere Art von Objekt zurückgeben könnten, nur für den Spaß von ihm:

class MySincereHandShake implements Cloneable
{
    public Object clone()
    {
       return new MyVengefulKickInYourHead() ;
    }
}

Da die Cloneable Schnittstelle missbraucht werden kann / verschleiert, soll es aus den gleichen Gründen verboten werden C ++ Operatorüberladung sollte sein?

Wir könnten die toString() Methode einer MyComplexNumber Klasse überlasten, um es die Zeichenfolge Stunde des Tages zurück. Sollte die toString() Überlastung auch verboten werden? Wir konnten MyComplexNumber.equals sabotieren, um es einen zufälligen Wert zurückgeben, ändern Sie die Operanden ... etc. etc. etc ..

In Java, wie in C ++, oder was auch immer die Sprache, muss der Programmierer ein Minimum von Semantik respektieren, wenn das Schreiben von Code. Dies bedeutet eine add Funktion implementieren, und Cloneable Umsetzungsverfahren, das Klonen und eine ++ Operator als Inkrementen.

fügt

Was ist das Verschleiern eigentlich?

Nun, da wir, dass Code kennen auch durch die unberührten Java-Methoden sabotiert werden kann, können wir sie über die tatsächliche Verwendung von Operator fragen in C ++ Überlastung?

Klare und natürliche Schreibweise: Methoden gegen Überladen von Operatoren

Wir werden weiter unten, für verschiedene Fälle, der „gleichen“ Code in Java und C ++, vergleichen, um eine Vorstellung davon zu haben, welche Art von Codierung Stil ist klarer.

Natur Vergleiche:

// C++ comparison for built-ins and user-defined types
bool    isEqual          = A == B ;
bool    isNotEqual       = A != B ;
bool    isLesser         = A <  B ;
bool    isLesserOrEqual  = A <= B ;

// Java comparison for user-defined types
boolean isEqual          = A.equals(B) ;
boolean isNotEqual       = ! A.equals(B) ;
boolean isLesser         = A.comparesTo(B) < 0 ;
boolean isLesserOrEqual  = A.comparesTo(B) <= 0 ;

Bitte beachten Sie, dass A und B von jeder Art in C ++ sein könnte, solange die Betreiber Überlastungen vorgesehen ist. In Java, wenn A und B sind nicht Primitiven, kann der Code wird sehr verwirrend, auch für primitive artige Objekte (BigInteger, etc.) ...

Natur Array / Behälter Zugriffs- und Subskribierung:

// C++ container accessors, more natural
value        = myArray[25] ;         // subscript operator
value        = myVector[25] ;        // subscript operator
value        = myString[25] ;        // subscript operator
value        = myMap["25"] ;         // subscript operator
myArray[25]  = value ;               // subscript operator
myVector[25] = value ;               // subscript operator
myString[25] = value ;               // subscript operator
myMap["25"]  = value ;               // subscript operator

// Java container accessors, each one has its special notation
value        = myArray[25] ;         // subscript operator
value        = myVector.get(25) ;    // method get
value        = myString.charAt(25) ; // method charAt
value        = myMap.get("25") ;     // method get
myArray[25]  = value ;               // subscript operator
myVector.set(25, value) ;            // method set
myMap.put("25", value) ;             // method put

In Java, sehen wir, dass für jeden Behälter die gleiche Sache zu tun (Zugriff auf ihren Inhalt über einen Index oder Identifier), wir haben eine andere Art und Weise, es zu tun, was verwirrend ist.

In C ++ jeder Behälter verwendet die gleiche Art und Weise seine Inhalte zugreifen, dank Betreiber Überlastung.

Natürliche erweiterte Typen Manipulation

Die folgenden Beispiele verwenden ein Matrix Objekt, unter Verwendung der ersten Links auf Google gefunden für " Java Matrix-Objekt " und „ c ++ Matrix-Objekt ":

// C++ YMatrix matrix implementation on CodeProject
// http://www.codeproject.com/KB/architecture/ymatrix.aspx
// A, B, C, D, E, F are Matrix objects;
E =  A * (B / 2) ;
E += (A - B) * (C + D) ;
F =  E ;                  // deep copy of the matrix

// Java JAMA matrix implementation (seriously...)
// http://math.nist.gov/javanumerics/jama/doc/
// A, B, C, D, E, F are Matrix objects;
E = A.times(B.times(0.5)) ;
E.plusEquals(A.minus(B).times(C.plus(D))) ;
F = E.copy() ;            // deep copy of the matrix

Und das ist nicht auf Matrizen beschränkt. Die BigInteger und BigDecimal Klassen von Java leiden unter der gleichen verwirrend Ausführlichkeit, während ihre Entsprechungen in C ++ als klar sind, wie integrierten Typen.

Natur Iteratoren:

// C++ Random Access iterators
++it ;                  // move to the next item
--it ;                  // move to the previous item
it += 5 ;               // move to the next 5th item (random access)
value = *it ;           // gets the value of the current item
*it = 3.1415 ;          // sets the value 3.1415 to the current item
(*it).foo() ;           // call method foo() of the current item

// Java ListIterator<E> "bi-directional" iterators
value = it.next() ;     // move to the next item & return the value
value = it.previous() ; // move to the previous item & return the value
it.set(3.1415) ;        // sets the value 3.1415 to the current item

Natur functors:

// C++ Functors
myFunctorObject("Hello World", 42) ;

// Java Functors ???
myFunctorObject.execute("Hello World", 42) ;

Text Verkettung:

// C++ stream handling (with the << operator)
                    stringStream   << "Hello " << 25 << " World" ;
                    fileStream     << "Hello " << 25 << " World" ;
                    outputStream   << "Hello " << 25 << " World" ;
                    networkStream  << "Hello " << 25 << " World" ;
anythingThatOverloadsShiftOperator << "Hello " << 25 << " World" ;

// Java concatenation
myStringBuffer.append("Hello ").append(25).append(" World") ;

Ok, in Java können Sie MyString = "Hello " + 25 + " World" ; verwenden ... Aber warten Sie eine Sekunde: Dies ist Betreiber Überlastung, ist es nicht? Ist es nicht Betrug ???

: - D

Allg Code?

Die gleichen generischen Code zu modifizieren Operanden sollten benutzbar sein, sowohl für Einbauten / Primitiven (die keine Schnittstellen in Java), Standard-Objekte (die nicht das Recht haben könnte interface) und benutzerdefinierte Objekte.

Um zum Beispiel den Mittelwert von zwei Werten beliebigen Typen Berechnung:

// C++ primitive/advanced types
template<typename T>
T getAverage(const T & p_lhs, const T & p_rhs)
{
   return (p_lhs + p_rhs) / 2 ;
}

int     intValue     = getAverage(25, 42) ;
double  doubleValue  = getAverage(25.25, 42.42) ;
complex complexValue = getAverage(cA, cB) ; // cA, cB are complex
Matrix  matrixValue  = getAverage(mA, mB) ; // mA, mB are Matrix

// Java primitive/advanced types
// It won't really work in Java, even with generics. Sorry.

Diskussion Betreiber Überlastung

Nun, da wir faire Vergleiche zwischen C ++ Code Überladen von Operatoren und den gleichen Code in Java gesehen haben, können wir jetzt „Überladen von Operatoren“ diskutieren als ein Konzept.

Überladen von Operatoren existiert seit vor dem Computer

Auch außerhalb der Informatik gibt es Überladen von Operatoren: Zum Beispiel in der Mathematik, Operatoren wie +, -, * usw. sind überlasten

.

Tatsächlich ist die Bedeutung von +, -, * usw. Veränderungen an den Typen der Operanden in Abhängigkeit (Numerik, Vektoren, Quantenwellenfunktionen, Matrizen, etc.).

Die meisten von uns, im Rahmen unserer Wissenschaft Kurse lernten mehrere Bedeutungen für die Betreiber in Abhängigkeit von den Typen der Operanden. sie haben wir wieder verwirrt, sie?

Überladen von Operatoren hängen von seinen Operanden

Dies ist der wichtigste Teil der Betreiber Überlastung: Wie in der Mathematik oder der Physik hängt der Betrieb auf seine Operanden Typen

.

So kennen den Typ des Operanden, und Sie werden die Wirkung der Operation wissen.

Sogar C und Java (hartcodiert) Betreiber Überlastung

In C wird das reale Verhalten eines Operators nach Änderung seiner Operanden. Zum Beispiel ist zwei ganzen Zahlen Hinzufügen anders als das Hinzufügen von zwei Doppel- oder sogar eine ganze Zahl und ein Doppelzimmer. Es gibt sogar die ganze Zeigerarithmetik Domain (ohne Gießen Sie in einen Zeiger eine ganze Zahl hinzufügen können, aber Sie können zwei Zeiger nicht hinzufügen ...).

In Java gibt es keine Pointer-Arithmetik, aber jemand noch String-Verkettung wäre ohne den + gefunden Betreiber lächerlich genug sein, eine Ausnahme in der rechtfertigen „Überladen von Operatoren ist böse“ Credo.

Es ist nur so, dass Sie, als C (aus historischen Gründen) oder Java (für persönliche Gründe , siehe unten) Coder, können Sie Ihre eigenen nicht zur Verfügung stellen können.

In C ++ Operatorüberladung ist nicht optional ...

In C ++, Überlastung Operator für integrierte Typen nicht möglich ist (und das ist eine gute Sache), aber benutzerdefinierter können Typen benutzerdefinierter Operator Überlastungen.

Wie bereits früher gesagt, in C ++, und im Gegenteil zu Java, benutzer Typen sind nicht Bürger zweiter Klasse der Sprache betrachtet, wenn sie auf eingebauten Typen verglichen. Also, wenn eingebauten Typen Operatoren haben, Benutzertypen sollten sie haben können, auch.

Die Wahrheit ist, dass, wie die toString(), clone(), equals() Methoden sind für Java ( dh quasi-Standard-like ), C ++ Überladen von Operatoren sind so sehr Teil von C ++, dass es so natürlich wird als die ursprünglichen C-Operatoren oder die zuvor genannten Java-Methoden.

In Kombination mit Template-Programmierung, Überladen von Operatoren werden ein bekanntes Design-Muster. In der Tat kann man nicht sehr weit in STL gehen, ohne überlasteten Operatoren und Operatoren für die eigene Klasse zu überlasten.

... aber es sollte nicht missbraucht werden

Überladen von Operatoren sollten danach streben, die Semantik des Bedieners zu respektieren. Sie subtrahieren nicht in einem + Operator (wie in "nicht in einer add Funktion subtrahieren" oder "return Mist in einer clone-Methode").

Guss Überlastung kann sehr gefährlich sein, weil sie zu Unklarheiten führen können. So sollten sie wirklich für gut definierte Fälle reserviert werden. Was && und ||, sie nicht immer überlasten, wenn Sie wirklich wissen, was Sie tun, wie Sie die die Kurzschlussauswertung, dass die native Betreiber && und || genießen werden verlieren.

So ... Ok ... Warum ist es nicht möglich, in Java?

Weil James Gosling, sagte so:

  

verließ ich aus Opertor Überlastung als ziemlich persönliche Wahl , weil ich auch gesehen habe viele Leute es in C ++ missbrauchen.

     

James Gosling. Quelle: http://www.gotw.ca/publications/c_family_interview.htm

Bitte vergleichen Gosling Text oben mit Stroustrup unter:

  

Viele C ++ Design-Entscheidungen haben ihre Wurzeln in meiner Abneigung Menschen zu zwingen, Dinge in einer bestimmten Art und Weise zu tun [...] Oft war ich versucht, eine Funktion ächten ich persönlich nicht mochte, verzichtete ich tun dies, weil ich dachte nicht, dass ich das Recht hatte, meine Ansichten über andere zu erzwingen.

     

Bjarne Stroustrup. Quelle: Die Desing und Entwicklung von C ++ (1.3 Allgemeiner Hintergrund)

Würde Betreiber Überlastung Nutzen Java?

würden Einige Objekte stark von Betreibern Überlastung profitieren (Beton oder numerischen Typen, wie BigDecimal, komplexe Zahlen, Matrizen, Container, Iteratoren, Komparatoren, Parser usw.).

In C ++ können Sie von diesem Vorteil profitieren, weil Stroustrup Demut. In Java, sind Sie einfach wegen Goslings geschraubt persönliche Wahl .

Könnte es zu Java hinzugefügt werden?

Die Gründe für die nicht das Hinzufügen Betreiber jetzt in Java Überlastung könnte eine Mischung aus interner Politik sein, Allergie auf das Merkmal, das Misstrauen des Entwicklers (Sie wissen, dass die Saboteur diejenigen scheinen Java-Teams ... verfolgen), Kompatibilität mit der frühere JVMs, Zeit, um eine korrekte Spezifikation, etc ..

zu schreiben

Also nicht halten Sie Ihren Atem für diese Funktion warten ...

Aber sie tun es in C # !!!

Ja ...

Während dies ist der einzige Unterschied zwischen den beiden Sprachen weit davon entfernt ist, das man nie versagt, mich zu amüsieren.

Offenbar die C # die Menschen mit den "jedes primitive ist ein struct und ein struct leitet sich vom Objekt" , haben es richtig beim ersten Versuch.

Und sie tun es in !!!

Trotz aller FUD gegen verwendet definierten Überladen von Operatoren, unterstützen die folgenden Sprachen: Scala , Dart , Python , F # , C # , D , Smalltalk , Groovy , Perl 6 , C ++, Rubin , Haskell , MATLAB , Eiffel , Lua , Clojure , 90 Fortran , Swift , Ada Delphi 2005 ...

So viele Sprachen, mit so vielen verschiedenen Philosophien (und manchmal entgegen), und doch alles, was sie an diesem Punkt einig.

Zum Nachdenken ...

James Gosling verglichen Gestaltung Java auf die folgenden:

  

"Es gibt dieses Prinzip zu bewegen, wenn Sie von einer Wohnung in einer anderen Wohnung zu bewegen. Ein interessantes Experiment ist Ihre Wohnung zu packen und legt alles in Kisten, dann in die nächste Wohnung bewegen und nicht alles auspacken, bis Sie sie brauchen. so dass Sie Ihre erste Mahlzeit, und Sie sind etwas aus einem Feld zu ziehen. dann, nach einem Monat oder so haben Sie verwendet, dass so ziemlich herauszufinden, was die Dinge in Ihrem Leben, das Sie wirklich brauchen, und dann nehmen Sie die Rest der Sachen - vergessen, wie viel Sie es mögen oder, wie cool es ist - und Sie es einfach wegwerfen es ist erstaunlich, wie das Ihr Leben vereinfacht, und man kann dieses Prinzip in allen Arten von Design-Fragen verwenden. nicht Dinge tun, nur weil sie sind cool oder einfach nur, weil sie interessant. "

Sie können den Kontext des Zitats hier

lesen

Grundsätzlich Betreiber Überlastung ist für eine Klasse, die Modelle eine Art von Punkt, der Währung oder komplexe Zahl. Aber nach, dass Sie beginnen schnell aus Beispielen ausgeführt wird.

Ein weiterer Faktor war der Missbrauch der Funktion in C ++ von Entwicklern Überlastung Operatoren wie ‚&&‘, ‚||‘, die Cast-Operatoren und natürlich ‚neu‘. Die Komplexität aus der Kombination mit Pass von Wert und Ausnahme ist in der Buch.

Schauen Sie sich Boost.Units: Link-Text

Es bietet Null-Overhead Dimensionsanalyse durch Überladen von Operatoren. Wie viel klarer kann diese bekommen?

quantity<force>     F = 2.0*newton;
quantity<length>    dx = 2.0*meter;
quantity<energy>    E = F * dx;
std::cout << "Energy = " << E << endl;

würde tatsächlich ausgegeben "Energie = 4 J", das korrekt ist.

Die Java-Designer entschieden, dass Betreiber Überlastung war mehr Mühe, als es wert war. So einfach ist das.

In einer Sprache, wo jedes Objekt Variable tatsächlich eine Referenz ist, bekommt Betreiber Überlastung die zusätzliche Gefahr von ganz unlogisch zu sein - zu einem C ++ Programmierern zumindest. Vergleichen Sie die Situation mit C # 's == Überladen von Operatoren und Object.Equals und Object.ReferenceEquals (oder was auch immer es genannt wird).

Groovy hat Überladen von Operatoren und läuft in der JVM. Wenn Sie nicht die Leistung Hit ausmacht (die kleineren alltäglichen bekommt). Es ist automatisch basierend auf Methodennamen. z.B. '+' ruft die 'plus (Argument)' -Methode.

Ich denke, das eine bewusste Design-Wahl gewesen sein kann Entwickler zu zwingen, Funktionen, deren Namen eindeutig ihre Absichten kommunizieren zu schaffen. In C ++ Entwickler würden überlasten Betreiber mit Funktionen, die oft in keinem Verhältnis zu den allgemein akzeptierten Art des gegebenen Betreibers würde, ist es fast unmöglich zu bestimmen, zu machen, was ein Stück Code tut, ohne auf die Definition des Betreibers an.

Nun kann man wirklich selbst in den Fuß mit Betreiber Überlastung schießen. Es ist wie mit Zeigern Menschen dumme Fehler mit ihnen machen und so wurde beschlossen, die Schere zu nehmen.

Zumindest glaube ich, dass der Grund ist. Ich bin auf Ihrer Seite sowieso. :)

, dass die Betreiber sagen führt zu logischen Fehlern vom Typ Überlastung, dass Bediener die Betriebslogik überein, es ist wie nichts zu sagen. Die gleiche Art von Fehler tritt auf, wenn Funktionsnamen für Betriebslogik ungeeignet ist - so was ist die Lösung: die Fähigkeit der Funktionsnutzung fallen !?  Dies ist eine komische Antwort - „Unangemessen für Betriebslogik“, jeden Parameternamen, jede Klasse, Funktion oder was auch immer logicly ungeeignet sein kann. Ich denke, dass diese Option in respektablen Programmiersprache zur Verfügung stehen sollten, und diejenigen, die denken, dass es nicht sicher ist - hey kein bothy sagt, Sie haben es zu benutzen. Hiermit kann die C # nehmen. Sie senkten die Zeiger aber hey - es gibt ‚unsicheren Code‘ Aussage -. Programm, wie Sie auf Ihr eigenes Risiko mögen

Einige Leute sagen, dass Betreiber in Java Überlastung zu obsfuscation führen würde. Haben diese Leute jemals irgend Java-Code zu tun, einige grundlegende Mathematik wie zunehmende einen finanziellen Wert um einen Prozentsatz mit BigDecimal aussehen gestoppt? .... die Ausführlichkeit einer solchen Übung wird eine eigene Demonstration obsfuscation. Ironischerweise Hinzufügen Betreiber Java Überlastung würde uns erlauben, unsere eigene Währung Klasse zu erstellen, die eine solche mathematischen Code elegant und einfach (weniger obsfuscated) machen würde.

Technisch gibt es Betreiber in jeder Programmiersprache Überlastung, die mit verschiedenen Arten von Zahlen umgehen kann, z.B. integer und reelle Zahlen. Erläuterung: Der Begriff Überlastung bedeutet, dass es einfach mehrere Implementierungen für eine Funktion. In den meisten Programmiersprachen verschiedene Implementierungen sind für den Operator + zur Verfügung gestellt, ein für ganze Zahlen, einen für Realen, diese Überladen von Operatoren genannt wird.

Nun, viele Menschen finden es seltsam, dass Java hat Operator für den Bediener + Überlastung für Strings zusammen zugibt und aus mathematischer Sicht wäre dies seltsam in der Tat sein, aber aus einer Programmiersprache des Entwicklers Standpunkt gesehen, es ist nichts falsch mit dem Hinzufügen builtin Betreiber für den Operator + für andere Klassen zB Überlastung String. die meisten Menschen sind sich einig jedoch, dass, wenn Sie für String für + gebautet add Überlastung, dann ist es eine gute Idee, diese Funktionalität für den Entwickler als auch zu liefern.

Ein vollständig mit dem Irrtum nicht einverstanden ist, dass Betreiber Überlastung Code verschleiert, da dies blieb für den Entwickler zu entscheiden. Das ist naiv zu glauben, und um ehrlich zu sein, es wird alt.

1 für das Hinzufügen von Operator in Java 8 zu überlasten.

Unter der Annahme, Java als Implementierungssprache dann a, b und c alle Referenzen wären Komplexe mit den Anfangswerten von null einzugeben. Auch diese Komplexe unter der Annahme ist unveränderlich wie die erwähnte BigInteger und ähnliche unveränderliche BigDecimal , ich würde ich denken, dass Sie die folgende bedeuten, wie Sie den Verweis auf den Komplex sind die Zuweisung von zurückgegeben b und c das Hinzufügen, und nicht diesen Hinweis auf einen Vergleich.

  

Ist das nicht:

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

viel einfacher als:

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

Manchmal wäre es schön, Betreiber Überlastung zu haben, Freund Klassen und Mehrfachvererbung.

Aber ich denke, es immer noch eine gute Entscheidung war. Wenn Java würde Betreiber Überlastung gehabt hat dann könnten wir nie von Operator Bedeutungen sicher sein, ohne Quellcode der Suche durch. Derzeit ist das nicht notwendig. Und ich denke, Ihr Beispiel von Methoden anstelle von Operatorüberladung verwendet, ist auch gut lesbar. Wenn Sie die Dinge machen wollen mehr klar, dass man immer einen Kommentar über haarige Aussagen hinzufügen könnte.

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

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

Menschen es nicht immer verantwortungsvoll nutzen. Schauen Sie sich dieses Beispiel aus dem Python-Bibliothek scapy:

>>> 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 / Betreiber hat als Zusammensetzung Operator zwischen zwei verwendet   Schichten. Dabei kann die untere Schicht eine oder mehrere seiner   Standardwerte Felder entsprechend der oberen Schicht überlastet. (Sie noch   kann geben Sie den gewünschten Wert). Ein String kann als Ausgangsschicht verwendet werden.

Alternativen zu Native Unterstützung von Java Überladen von Operatoren

Da Java keine Überladen von Operatoren haben, sind hier einige Alternativen, die Sie suchen in können:

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

Wenn jemand bewusst anderer, bitte kommentieren, und ich werde es zu dieser Liste hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top