Frage von chr0m92, 72

Java-vorgefertigten Klasse neue Methode beibringen?

Hallo,

Ich stehe gerade auf dem Schlauch: Ich habe eine ArrayList mit verschiedenen Koordinaten (x|y)...jetzt versuche ich die gesamte Länge der Punkte auszugeben(Abstände der verschiedenen Punkte zueinander)... Dafür brauche ich eine Methode getLaenge(), aber wo schreibe ich die rein?

Theoretisch bräuchte ich ja eine neue Klasse, zB MeineArrayListe, und dann extends ArrayList...aber das möchte ich nicht.

Dann gäbe es noch die Möglichkeit, dass ich eine eigene ArrayList schreibe, aber wie sorge ich nun dafür, dass diese auch alle Methoden einer ArrayList hat? (Möchte statische Methoden vermeiden)

Bin noch Java Neuling und bin dankbar für jeden Hinweis.

Antwort
von woflx, 42

In C# gibt es dafür die Extensions, in Java muß man sich anders behelfen, siehe etwa hier: http://stackoverflow.com/questions/18977706/can-i-create-extensions-in-java-like...

Standardlösung ist es eben, eine Helper-Klasse zu schreiben mit statischen Methoden oder eine abgeleitete Klasse zu erstellen.

Kommentar von Reyha24 ,

Wobei eine abgeleitete Klasse in diesem Fall nicht sinnvoll wäre. Er möchte die grundsätzliche Funktionalität der ArrayList nicht erweitern.

Antwort
von MalNachgedacht, 30

Theoretisch bräuchte ich ja eine neue Klasse, zB MeineArrayListe, und dann extends ArrayList...aber das möchte ich nicht.

Das wäre aber sozusagen der sauberste Weg und auch im Sinne der objektorientierten Programmierung

Dann gäbe es noch die Möglichkeit, dass ich eine eigene ArrayList schreibe, aber wie sorge ich nun dafür, dass diese auch alle Methoden einer ArrayList hat? 

Tja - am einfachsten dadurch dass Du deine vorherige Idee umsetzt und deine eigene Klasse die Klasse ArrayList erweitern läßt. Dann hat die nämlich automatisch alle Methoden der Klasse ArrayList.

Zu guter letzt kannst Du natürlich auch in jeder anderen Klasse eine entsprechende Methode definieren die als Parameter eine ArrayList entgegennimmt und daraus dann irgendeine Länge berechnet und zurückgibt.

Da diese Methode ja nur auf die Methoden des übergebenen Parameters zurückgreift und auf keine Member-Variablen oder Methoden der Klasse in der sie definiert ist kann (muss aber nicht) diese Methode dann selbst auch als Static definiert werden

(Möchte statische Methoden vermeiden)

Wenn eine Methode keinen Zugriff auf die Member-Variablen oder Methoden benötigt dann SOLLTE man sie als Static defininiert.

Das erleichtert zumindest die Lesbarkeit des Codes.

Deine Methode "Länge" ist ja nichts anderes wie ein mathematische Funktion die aus einem Inputparameter einen Output errechnet der nur vom übergebenen Inputparameter abhängt.

Also nichts anderes wie z.B. sin() oder cos() und die sind in Java in Math.sin() und Math.cos() auch als static definiert....

Wenn man neu in Java ist tendiert man manchmal dazu die Zahl der eigenen Klassen klein zu halten - das entpuppt sich im Nachhinein regelmässig als Fehlentscheidung...

Kommentar von chr0m92 ,

Vielen Dank für die ausführliche Antwort!

Wenn ich das nur für mich programmieren würde, würde ich es wahrscheinlich statisch machen, aber mein Prof hat da was dagegen... der ist allergisch gegen static-Zeugs :(

Kommentar von MalNachgedacht ,

Statische Methoden verleiten dazu prozedural zu programmieren und den Code wieder von den Daten zu trennen die er bearbeitet - während der objektorientierte Ansatz ja darin besteht das Code und die Daten die der Code bearbeitet eine Einheit bilden.

In deinem Fall berecht der Code eine "Länge" aus Daten in einer ArrayList vorliegen - von daher gehört der Code auch in diese Klasse. Ist das nicht empfehlenswert weil es sich um eine Standardklasse handelt dann wäre eine abgeleitete Klasse der richtige Ansatz.

Wenn Du das hingegen in irgendeiner Klasse die nicht von ArrayList erbt als Methode implementierst dann wird das (ohne künstiche Verrenkungen) immer eine Methode sein die du als static deklarieren kannst da die Methode ja nur die Daten aus der ArrayList braucht um ihre Arbeit zu erledigen - und nichts von der Klasse in der sie außerhalb definiert wurde.

Natürlich kann man static als Schlüsselwort trotzdem weglassen aber wo da nun der Vorteil liegen soll würde mich dann doch  interessieren

Wie gesagt - auch sinus und cosinus sind in Java static - und dagegen ist absolut nichts einzuwenden...

Kommentar von Reyha24 ,

Was spricht gegen wrapping?

Kommentar von Reyha24 ,

Ein Nachteil vom Wrapping ist Boilerplate-Code. Die Nachteile vom Vererben sind aber deutlich gravierender. Wenn man nicht aufpasst, dann verändert man das Verhalten der Oberklasse, wo es überhaupt nicht notwendig war. Wozu braucht man die Möglichkeit Member einer Oberklasse zu überschreiben? Hier macht das keinen Sinn. Gewünscht ist lediglich eine Funktionalität, die auf Daten eines Containers basiert und das geht wunderbar ohne kritische Probleme durch wrapping.

Kommentar von MalNachgedacht ,

Die Nachteile vom Vererben sind aber deutlich gravierender. Wenn man nicht aufpasst, dann verändert man das Verhalten der Oberklasse, wo es überhaupt nicht notwendig war.

Wenn man eine Klasse aus einer bestehenden Klasse ableitet ändert sich dadurch rein gar nichts an der Oberklasse - und kein bestehender Code der mit dieser Oberklasse arbeitet muss irgendwie angepaßt werden oder liefert irgendwelche anderen Ergebnisse...

Nur wer mit der abgeleiteten Klasse arbeitet kommt mit den neuen oder veränderten "Funktionen" überhaupt in Kontakt - wobei hier ja auch keine vorhandene Methode überschrieben wird (was möglicherweise unerwartete Folgen haben könnte wenn man den Code der Oberklasse nicht kennt) sondern nur eine zusätzliche Methode implementiert wird ....

Und diese zusätzliche Methode muss ja nicht einmal  irgendwelche Internas von ArrayList verwenden oder gar eingreifen sondern kann über die public-Methoden von ArrayList implementiert werden.

Wo soll da nun eine Gefahr entstehen?

Kommentar von Reyha24 ,

Du hast die unerwarteten Folgen schon erkannt. Beim wrapping hast du diese nicht. Zudem möchtest du die Implementierung der ArrayList nicht ändern, sondern nur eine weitere Funktion hinzufügen, die auf einer ArrayList basiert. Wie gesagt :p

Kommentar von Reyha24 ,

Viele tendieren zur Vererbung, obwohl sie manchmal fehl am Platz ist.

Antwort
von Masterman431, 53

Kannst du nicht einfach in der Selben Klasse eine Methode anlegen, die die ArrayList anspricht????

Kommentar von chr0m92 ,

Wie geht das?

Antwort
von Reyha24, 46

Länge der Punkte? Was soll das sein? :)

Kommentar von chr0m92 ,

Das tut eigentlich nichts zur Sache, aber angenommen Du hast ein Koordinatensystem mit 2 Punkte: (x=3,y=5) , (x=7,y=3)...durch Berechnen der Hypthenuse erhälst Du  die Entfernung beider Punkte...und das eben mit 13 Punkte...die gesamte Strecke der Punkte

Kommentar von Reyha24 ,

Achso, also Abstand zweier Punkte

Kommentar von Reyha24 ,

Erstelle eine Klasse, pack dort die ArrayList rein und schreibe eine Funktion die eben die Abstände berechnet.

Kommentar von chr0m92 ,

Dann bekomm ich "this method is undefined for the Type ArrayList"...was ich auch verstehen kann :(

Kommentar von Reyha24 ,

Dann machst du etwas falsch :p Du sollst die Methode nicht für die ArrayList definieren, sondern für deine eigene Klasse, die dann auf der ArrayList arbeitet. Nennt sich wrapping.

Kommentar von chr0m92 ,

Mein Java Horizont ist noch nicht so weit, dass ich damit arbeiten könnte. Ich weiß grob was es ist, kann es aber nicht implementieren.

Keine passende Antwort gefunden?

Fragen Sie die Community