PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: das Ding mit den eckigen Klammern oder auch: "Operatoren überladen"



Sym
11-10-2003, 01:31
Hi,

also, ich programmiere eigentlich schon länger. In letzter Zeit versuche ich mir Java wesentlich näher zu bringen. Ich habe so ein Grundlagenbuch und den Rest ziehe ich mir irgendwie aus dem Netz ;).

Situation:

Ich habe mir eine einfach-verkettete Liste gebaut. Die Methode

Object getData(int pos)
gibt mir mir die Information der List an Stelle pos zurück. Weiter setzt die Methode

setData(int pos, Object oData)
das Datum an die Stelle pos.

Lieber wäre mir,

dass ich mit der Liste, wie mir einem Array umgehen könnte. Entsprechend:

List list = new List(obj1);
addElement(obj2);
addElement(obj3);

list[2] = obj1;
So, da es sich dabei um überladen von Operatoren handelt, habe ich danach gesucht. Nun habe ich gelesen, dass dies nicht möglich sei. Stimm dies? Läßt es sich doch irgendwie realisieren?

bischi
11-10-2003, 08:09
Also überladen kannst du nicht - aber du könntest das ganze beispielsweise gleich in einem Array abspeichern - oder hab ich was falsch verstanden?

MfG Bischi

peschmae
11-10-2003, 10:13
Operatoren überladen kommt erst mit Java 1.5 Und das gibts noch nicht.
Allenfalls ne Preview oder so.

Es gibt auch Ansätze mit Preprozessoren sowas zu emulieren. z.B. da:
http://mindprod.com/jgloss/operatoroverloading.html (Ups, der Link ist broken, naja vielleicht sonst irgendwo)

MfG Peschmä

anda_skoa
11-10-2003, 10:50
Original geschrieben von peschmae
Operatoren überladen kommt erst mit Java 1.5

Uuiuiui :)
Das ist mir neu, gaaaanz feine Sache.

Mit Generics und Operatoroverloading gibts dann eigentlich keine Defizite mehr in der Sprache selbst.

Ciao,
_

Sym
11-10-2003, 11:33
Original geschrieben von bischi
Also überladen kannst du nicht - aber du könntest das ganze beispielsweise gleich in einem Array abspeichern - oder hab ich was falsch verstanden?

MfG Bischi

:rolleyes: , naja, so war das nicht gemeint. Die Liste sollte ja dynamisch sein.

Ich könnte natürlich auch das entsprechende zu ändernde Element löschen und ein neues anfügen, aber das finde ich nicht so toll.

Dann schaue ich mich mal nach einem Erscheinungtermin von Java 1.5 um. Ist hier schon was bekannt dazu?

MfG

bischi
11-10-2003, 11:53
Ich hab mir C/C++ nur mal kurz angeschaut (VisualC++). Bin aber nie über Kommandozeilenprogs herausgekommen. Kann mir jemand mal erklären, was dieses Überladen denn genau bringt?

MfG Bischi

PS: Hoffentlich machen sie Swing in 1.5 nochmal was schneller!

Sym
11-10-2003, 12:08
Du kannst neue eigene Objekte erzeugen und die normalen (intuitiven) Operatoren nutzen.

Beispiel:

Ich habe für ein Kryptologieprogramm verschiedene Ideale unter C++ programmiert. Da man mit Idealen auch rechnen kann, habe ich den Operator "+" überladen und konnte zwei Ideale normal addieren.

ideal3 = ideal2 + ideal1;
Ich hoffe, das wurde verständlich.

Natürlich braucht man es nicht direkt, es ist nur eine Spur komfortabler ;).

anda_skoa
11-10-2003, 14:05
Original geschrieben von Sym
Natürlich braucht man es nicht direkt, es ist nur eine Spur komfortabler ;).

Es erhöht auch die Lesbarkeit des Codes, weil dann zum Beispiel ein Vergleich auf Gleichheit immer mit dem == Operator geschrieben werden kann.

Allerdings ist beim Überladen immer Vorsicht angebracht, damit man die Bedeutung eines Operators nicht verletzt, besonders bei Vergleichsoperatoren.

Ciao,
_

peschmae
11-10-2003, 14:22
Ups, sorry Leute, da hab ich wohl was durcheinandergekriegt

Operatorenüberladen ist eben das was (neben all den anderen schönen dingen) für Java 1.5 nicht vorgesehen ist. Schade.

Was kommt steht z.B. da http://www.petebevin.com/archives/000528.html

MfG Peschmä

peschmae
11-10-2003, 14:27
Zum Operatorenüberladen, schau mal da:
http://www.gginc.biz/jfront/index.html

MfG Peschmä

Sym
11-10-2003, 22:50
Original geschrieben von peschmae
Zum Operatorenüberladen, schau mal da:
http://www.gginc.biz/jfront/index.html

MfG Peschmä

Jupp, dass sieht eigentlich ganz gut aus. Allerdings weiß ich nicht, wie ich das mit [] realisieren sollte. Gibt es irgendwie die Möglichkeit, zu schauen, wie das von sun umgesetzt wurde? Ich finde dazu leider (noch) nichts. Aber ich schaue mal weiter.

Thx

Gaert
11-10-2003, 23:35
Das Überladen der Operatoren erhöht zwar die Lesbarkeit, wenn man es jedoch verwendet ohne es zu kommentieren und das Projekt an einen anderen Entwickler übergibt sollte man lieber in deckung gehen wenn er wutentbrannt zur Kaffeetasse greift.
Die meisten Entwickler sind nicht an das Überladen gewöhnt und blicken durch den Code nicht mehr durch - das sagt meine Erfahrung - und dann ist die Kacke richtig am dampfen!

Mein Tipp: Lasst das Überladen sein und verwendet altbewährtes - derjenige der das Programm weiterentwickeln muss wird es euch danken.

Sym
11-10-2003, 23:55
Das sehe ich ein wenig anders.

Wenn ich eine neue Klasse erzeuge, welche (wie in dem einen Link hier), komplexe Zahlen als Intanzen erzeugbar macht, ist es meiner Meinung nach schon sinnvoll.

Den Code sollte jeder Programmierer schon nachvollziehen kann! Meist wird der entwickelte Code doch eh nicht weitergegeben. Die Forschung prüft die Algorithmen. Die Entwicklungsabteilung setzt dann meist die Alg. um und entwickelt das Produkt.

Gebe ich einen Code von mir weiter, sollten die Kommentare reichen. Gebe ich nur die Klasse weiter, ist es für den Nutzer doch eher intuitiv, wenn er die Standard-Operatoren nutzen kann, oder?

Meine Meinung.

peschmae
12-10-2003, 08:26
*zustimm*

Schliesslich kannst du ja in der Javadoc zur Klasse auch erwähnen, dass die Standardoperatoren verwendet werden können..

MfG Peschmä

anda_skoa
12-10-2003, 10:34
Das hängt wesentlich davon ab, was in der jeweiligen Sprache üblich ist.

Ein C++ Programmierer wird dich bemitleiden, wenn du statt überladener Operatoren nur Methoden hast, und zu einer anderen Bibliothek greifen.

In Java wird er dirhc erhängen, erschiessen und vierteile (nicht nötigenfalls in dieser Reihenfolge), weil dort zB == immer Referenzen vergleichen sollte und = eine Referenz zuweist, etc. (falls es überhaupt möglich ist, das zu ändern).

Da es offensichtlich eh nicht in der nächsten Version vorgesehen ist, spielt das ja keine Rolle mehr.
Soltle es in einer zukünftigen Version möglich sein, wird man aber sehr aufpassen müssen, wenn man Klassen für andere Entwickler schreibt.

Ciao,
_