Ich muss eine Klasse mit genau den gleichen Methoden wie java.lang.String
erstellen.
Was ist der beste Weg, dies in Java zu tun?
Ich weiß, dass ich die String-Klasse nicht erweitern kann, da sie final
ist. Ich suche keine Lösungen, bei denen ich den Quellcode von java.lang.String
kopieren muss. Angenommen, ich benötige die Funktionalität length()
in meiner benutzerdefinierten Klasse mit dem Namen MyString
, die eine entsprechende Methode 'myLength ()' hat.
Was ist der beste Weg, myLength()
zu implementieren?
Ich untersuche nicht verschiedene Algorithmen, um die Länge eines Strings zu ermitteln, sondern die Methode String
von length()
wiederzuverwenden. Nun, sobald ich MyString
class bereit habe, sollte ich es überall für meine benutzerdefinierten Manipulationen verwenden können.
Aus Ihrer Frage klingt das, wonach Sie suchen, eine einfache Delegation :
%Vor%Wenn wir die verschiedenen Antworten hier und die Aktualisierungen und Klarstellungen der Fragesteller durchgehen, scheint es, dass der Fragesteller eine Klasse wünscht, die wie eine Schnur aussieht, riecht und klingt, aber nicht.
Das möchten sie tun können:
%Vor% Dies kann nicht funktionieren, da java.lang.String
eine letzte Klasse ist und jedes "String"
, das der Compiler erzeugt, ein java.lang.String
-Objekt ist, da dies kein MyString
-Objekt ist, das sie einander nicht zugewiesen werden können .
In schwach typisierten Sprachen könntest du eine solche Klasse erstellen, denn wenn eine Klasse aussieht, riecht und klingt wie eine Ente , dann ist es in jeder Hinsicht eine Ente. Java ist jedoch eine stark typisierte Sprache, und eine Ente ist nur eine Ente, wenn sie zufällig aus der Familie der Anatidae stammt .
Ich nehme an, du meinst java.lang.String
. Sie können jedoch String
nicht durch Ihre eigene Klasse ersetzen. Sie können eine andere Klasse mit denselben Methoden erstellen (indem Sie den Quellcode kopieren und die Paketdeklaration ändern), aber Sie können Instanzen dieser Klasse nicht an Methoden übergeben, die ein String
erfordern.
Was eine wichtige Frage aufwirft: Warum glauben Sie, dass Sie das tun wollen?
Proxy Designmuster, denke ich. Es ist jedoch eine dumme Frage (keine Reflexion über den Fragesteller, sondern über die Person, die ihn in einem Vorstellungsgespräch gefragt hat). Möglicherweise hat die Person, die dich fragt, nicht bemerkt, dass String endgültig ist? Sonst kann ich nicht denken, warum sie überhaupt fragen würden.
Machen Sie eine neue Klasse (es wird ein anderes Paket benötigen, natürlich, implementieren Sie die gleiche Schnittstelle und fügen Sie alle öffentlichen Methoden aus der String-Klasse (lesen Sie die Javadoc um sicherzustellen, dass Sie alles bekommen).
Ich muss annehmen, dass dies Hausaufgaben sind.
Sie können das Refactoring verwenden: Ersetzen Sie die Vererbung durch Delegierung , was im Grunde genommen (wie in früheren Antworten gezeigt) ist. um eine Instanzvariable des gewünschten Typs zu erstellen und alle ihre Methoden in der neuen Klasse zu implementieren und die Nachricht an sie weiterzuleiten.
Erstellen Sie ein Feld für die Oberklasse, passen Sie die zu delegierenden Methoden an die Oberklasse an und entfernen Sie die Unterklasse.
Sie werden bemerken, dass es viel Tippen ist, wenn eine gute IDE praktisch ist.
Das folgende Video zeigt, wie IntelliJ IDEA 9 es macht.