Wie erstellt man ein String-Klassenreplikat?

8

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.

    
Thunderhashy 15.01.2010, 00:22
quelle

8 Antworten

5

Aus Ihrer Frage klingt das, wonach Sie suchen, eine einfache Delegation :

%Vor%     
Fabian Steeg 18.01.2010, 23:24
quelle
8

Da final -Klassen nicht unterklassifiziert werden können, erstellen Sie eine neue Klasse, in der eine String -Instanz hat, und arbeiten Sie an diesem Objekt.

%Vor%     
TBH 15.01.2010 00:26
quelle
8

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 .

    
Paul Wagland 19.01.2010 00:31
quelle
3

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?

    
erickson 15.01.2010 00:26
quelle
3

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.

    
ZoFreX 15.01.2010 00:42
quelle
2

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.

    
Yishai 15.01.2010 00:25
quelle
1

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.

Ссылка

    
OscarRyz 19.01.2010 00:07
quelle
0

Wenn Sie nur einen Teil des String-Verhaltens überschreiben möchten, können Sie versuchen, einen dynamischen Proxy zu verwenden. Schauen Sie in der API nach java.lang.reflect.Proxy .

    
BigMikeW 15.01.2010 00:42
quelle

Tags und Links