Wie eigene String-Klasse schreiben

Hallo,

ich habe folgendes Problem:
Ich verwende eine Java-Methode die als Argument einen String erwartet. Über eine andere Java-Methode kann dann dieser String wieder abgefragt werden.

Anstelle des String würde ich aber gerne mehre Informationen übergeben z.B. auch ein Objekt.

Ich suche deshalb einen Weg eine eigene String-Klasse zu schreiben, die mir es auch erlaubt ein Objekt aufzunehmen. D.h. nach außen soll die Klasse wie String reagieren hat aber zusätzlich eine Möglichkeit ein Objekt zu transportieren und natürlich Zugriffsmethoden auf dieses Objekt.

Ist dies möglich und wie ???

Danke
Arni

Hallo,

da die Klasse String final ist, kannst du sie nicht ableiten.
Du hast ja eine Methode, die einen String erwartet, darum kannst du nicht einfach eine eigene Klasse schreiben, da diese kein Subtyp von String sein darf.
Eine einfache lösung wäre:
class XXX {
private String s;
private Object o;

public XXX(String s, Object o) {
this.s = s;
this.o = o;
}

public String getString() {
return s;
}

public Object getObject() {
return o;
}
}

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Und wie übergebe ich nun diese Klasse an meine Methode. Das Problem ist doch, dass die Methode einen String erwartet. Ich kann doch nicht einfach die Klasse XXX auf String casten "(String)XXX; " ???

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Problem ist doch, dass die Methode einen String erwartet. Ich
kann doch nicht einfach die Klasse XXX auf String casten
"(String)XXX; " ???

Wenn deine Methode einen String erwartet, kannst du
auch nur einen String uebergeben, soviel ist klar.
Das sieht dann aber so aus.

myMethod(validObjXXX.getString());

Somit hast du deine zusaetzlichen Informationen natuerlich
nicht. Also muesstest du eventuell an deiner Methode schrauben,
sodass sie z.B. ein XXX Object verarbeiten kann.

Gruss, Patrick

class XXX {
private String s;
private Object o;

public XXX(String s, Object o) {
this.s = s;
this.o = o;
}

public String getString() {
return s;
}

public Object getObject() {
return o;
}
}

Moin

Anstelle des String würde ich aber gerne mehre Informationen
übergeben z.B. auch ein Objekt.

Du kannst dir einen look-up basteln:

Du stopf jeden String zusammen mit der passenden Information/Object in eine Hashtable. Wenn zu dem String die Informationen/Objecte wieder gebraucht werden holst du sie aus der Hashtable wieder raus.

Die Standart-Objecte, die nur String-Objecte erfahrten, sehen nur die Strings. Deine Programmteile könenn über die Hashtable aber jederzeit an die restlichen Informationen ran.

(Warnung: Hashtable vergleicht auf .equals-Basis. für ==-Tablen gibt andere Klassen)

cu

Hi
hört sich ja gut an aber ich stehe wohl gerade etwas auf der Leitung !

Wenn ich eine Methode habe, die ein String-Objekt erwartet, wie kann ich dieser dann eine Hashtabelle übergeben ?

Kannst Du mir das vielleicht an einem kurzen Beispiel nochmals etwas ausführlicher erläutern.

Danke
Arni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

du willst die neue Klasse an die Methode übergeben,
du willst die Hashtable an die Methode übergeben…

so ist das immer nicht gedacht,
die Methode kann nur String als Parameter bekommen
-> dann bekommt sie genau den String und nix weiter,

wenn du die Methode nicht ändern kannst (weitere Parameter),
dann musst du aussen rum das Objekt speichern (1.)
oder separat in einer zweiten Speicherstruktur (2.)

zu 1. wurde ja schon manches geschrieben,
Trick im wesentlichen:
nicht mit dem Objekt x mit der besagten Methode arbeiten,
sondern mit einem anderen Objekt,
das den String oder das x-Objekt und die zusätzliche Information speichert

zu 2. ist das so gemeint, dass du x.methode(String) normal verwendest,
und nebenbei eine Hashtable hast, da kannst du die zusätzliche Information speichern,
hashtable.put(String, info) oder hashtable.put(x-Objekt, info)

mit
hashtable.get(String)/ hashtable.get(x-Objekt)

kannst du die Info zurückerhalten,

Moin

Wenn ich eine Methode habe, die ein String-Objekt erwartet, wie
kann ich dieser dann eine Hashtabelle übergeben ?

Gar nicht. Muss auch nicht.

Kannst Du mir das vielleicht an einem kurzen Beispiel nochmals
etwas ausführlicher erläutern.

Erstmal braucht man eine Hashtable:

import java.util.\*;

public class Global{
 public static Hashtable Informationen\_zu\_Strings = new Hashtable();
}

Ich nehm mal an du willst die String in irgendwelche „vordefinierten“ Methoden wie zum Beispiel:

JLabel.setText(String s)

stopfen. jlabel sein jetzt mal so ein JLabel.

irgendwo in irgendeiner Klasse:

String hallo = "blablabla";
Object informationen\_zu\_hallo = ...... was auch immer .....

Global.Informationen\_zu\_Strings.put (hallo,informationen\_zu\_hallo);
jlabel.setText(hallo);

Das Object „informationen_zu_hallo“ speicherst du nicht weiter. Es ist ja in der Hashtable eingetragen.

Irgendwann später an irgendeiner anderen Stelle im Code:

String kenn\_ich\_noch\_nicht = jlabel.getText();
Object informationen\_zu\_hallo = Global.Informationen\_zu\_Strings.get(kenn\_ich\_noch\_nicht);

Und schon hat man die Informationen zurück.

Noch 3 Takte dazu:

  1. Klassen wie Global mit einer public static-Variable gelten als sehr schlechter Programmierstyl. Sowas tut man nicht wenn man es vermeiden kann.

  2. Wenn du Threads einsetzt kann das ganz böse Ärger geben. Wenn du noch nicht weist was Threads sind: mach dir keine Sorgen, das geht schon.

  3. Hashtable unterscheidet nach equals-Methode und nicht nach ==. Dazu ein Beispiel:

    String t1 = „HALLO_DA“;
    String t2 = „HALLO“;
    String t3 = „_DA“;

    String t4 = t2 + t3;

    System.out.println (t1);
    System.out.println (t4); //Da wird zweimal „HALLO_DA“ rauskommen, aber:

    if (t1 == t4){
    System.out.println („gleich laut ==“);
    } else {
    System.out.println („ungleich laut ==“); //Das wird angezeigt werden
    }

    if (t1.equals(t4)){
    System.out.println („gleich laut equals“); //Und das wird angezeigt werden
    } else {
    System.out.println („ungleich laut equals“);
    }

Ein kleiner aber WICHTIGER Unterschied.

cu